Mögliche Duplizieren:
C compiler bug (floating point arithmetic)?Doubles, das sind * genau * gleich 0 sind für (a == b) Rückkehr
ich zwei Doppelzimmer haben, die ich garantieren kann, sind genau gleich 150 Dezimalstellen - dh. Mit dem folgenden Code:
printf("***current line time is %5.150lf\n", current_line->time);
printf("***time for comparison is %5.150lf\n", (last_stage_four_print_time + FIVE_MINUTES_IN_DAYS));
... Rückkehr:
***current line time is 39346.526736111096397507935762405395507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
***time for comparison is 39346.526736111096397507935762405395507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
FIVE_MINUTES_IN_DAYS
ist #defined und current_line->time
und last_stage_four_print_time
sind beide Doppelzimmer.
Mein Problem ist, dass die nächste Zeile meines Debugging-Code:
printf("if condition is %d\n", (current_line->time >= (last_stage_four_print_time + FIVE_MINUTES_IN_DAYS)));
gibt die folgende:
if condition is 0
Kann mir jemand sagen, was hier los? Ich bin mir der nichtdezimalen/ungenauen Natur von floats
und doubles
bewusst, aber diese unterliegen überhaupt keinem Fehler (die ursprünglichen Zahlen wurden alle mit sscanf
oder # definiert gelesen und sind alle auf 10 Dezimalstellen spezifiziert).
EDIT: Mein Fehler war die Annahme, dass printf
-ing das Doppel genau sie im Speicher dargestellt, die falsch war, weil ein Wert on-the-fly berechnet wird. (last_stage_four_print_time + FIVE_MINUTES_IN_DAYS)
als threshold_time
deklarieren und stattdessen das Problem behoben. Ich werde dafür sorgen, dass ein Epsilon für meine Vergleiche verwendet wird - ich wusste, dass dies der richtige Weg war. Ich war nur verwirrt darüber, warum diese Werte, die ich (fälschlicherweise) für identisch hielt, anscheinend ungleich waren.
Was ist die '# define' für' FIVE_MINUTES_IN_DAYS'? Ist es ein 'langes Doppel'? Es gibt eine Menge, die du uns nicht zeigst. – Potatoswatter
Wow, 7 Antworten in etwa 5 Minuten: D FIVE_MINUTES_IN_DAYS ist definiert als '#define FIVE_MINUTES_IN_DAYS 0.0034722222' –
Speichern Sie Ihre' a + b' in einem Float. Verwenden Sie einen nicht signierten Char-Zeiger und geben Sie die Adresse des Floats ein und prüfen Sie, ob die Bitmuster der beiden Floats wirklich übereinstimmen. Wenn sie es tun, dann ist da etwas faul. Else die Antworten hier sind die Möglichkeiten zu gehen –