可能重复:
C 编译器错误(浮点运算)?
我有两个双打,我可以保证完全等于 150 位小数 - 即。以下代码:
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
都是双精度数。
我的问题是我的调试代码的下一行:
printf("if condition is %d\n", (current_line->time >= (last_stage_four_print_time + FIVE_MINUTES_IN_DAYS)));
返回以下内容:
if condition is 0
谁能告诉我这里发生了什么?我知道非小数/不精确的性质,floats
但doubles
它们根本不会出现任何错误(原始数字都已使用sscanf
或#defined 读取,并且都指定到小数点后 10 位)。
编辑:我的错误是假设printf
-ing 双打在内存中准确地表示了它们,这是错误的,因为正在计算一个值。声明(last_stage_four_print_time + FIVE_MINUTES_IN_DAYS)
为threshold_time
并使用它来解决问题。我将确保使用 epsilon 进行比较 - 我知道这是要走的路,我只是对为什么我(错误地)认为看起来相同的这些值显然不相等感到困惑。