这个问题在这里已经有了答案:
10年前关闭。
Possible Duplicate:
C compiler bug (floating point arithmetic)?
我有两个 double ,我可以保证完全等于 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
都是 double 。我的问题是我的调试代码的下一行:
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
- 使 double 准确地在内存中表示它们,这是错误的,因为正在即时计算一个值。声明 (last_stage_four_print_time + FIVE_MINUTES_IN_DAYS)
如threshold_time
并使用它来解决问题。我将确保使用 epsilon 进行比较 - 我知道这是要走的路,我只是对为什么我(错误地)认为看起来相同的这些值显然不相等感到困惑。
最佳答案
浮点数肯定不准确到 150 位有效数字,所以我不确定从“视觉”比较(如果有的话)中可以得出什么结论。
另一方面,这些值显然并不完全相同(它们怎么可能是相同的,因为其中一个是通过加法当场计算出来的?)。所以不清楚为什么你看到的行为是意外的。
永远不要像那样比较浮点数,只需对差异与 epsilon 进行标准比较。
关于c - *完全*相等的 double 为 (a==b) 返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10006237/