重複の可能性:
C コンパイラのバグ (浮動小数点演算)?
小数点以下 150 桁に正確に等しいことを保証できる double が 2 つあります。次のコード:
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));
...戻り値:
***current line time is 39346.526736111096397507935762405395507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
***time for comparison is 39346.526736111096397507935762405395507812500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
FIVE_MINUTES_IN_DAYS
は #defined であり、current_line->time
とlast_stage_four_print_time
は両方とも double です。
私の問題は、デバッグ コードの次の行です。
printf("if condition is %d\n", (current_line->time >= (last_stage_four_print_time + FIVE_MINUTES_IN_DAYS)));
以下を返します。
if condition is 0
ここで何が起こっているのか誰か教えてもらえますか? floats
andの非 10 進数/不正確な性質を認識してdoubles
いますが、これらはまったくエラーの対象ではありません (元の数値はすべてsscanf
または #define で読み取られ、すべて小数点以下 10 桁まで指定されています)。
編集:私の間違いは、ダブルスをメモリ内で正確に表現すると仮定してprintf
いましたが、1つの値がオンザフライで計算されているため、これは間違っていました。(last_stage_four_print_time + FIVE_MINUTES_IN_DAYS)
asを宣言してthreshold_time
それを使用すると、問題が解決しました。比較には必ずイプシロンを使用します。それが正しい方法であることはわかっていましたが、(誤って)同じように見えると思っていたこれらの値が明らかに等しくない理由について混乱していました。