c - *完全*相等的 double 为 (a==b) 返回 0

标签 c comparison floating-point

这个问题在这里已经有了答案:




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->timelast_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/

相关文章:

c - C 中的 MPI INT 数组

java - 整数类型的 double /浮点比较(关系运算符)的精度是多少?

C 浮点文字 - 在 EBNF 中定义

c - 我的 float 值与我在 C 中的值不匹配

python - 如何在 python 中计算具有 unicode 组件的字符串的数值?

c - 修复 "comparison between signed and unsigned integer"警告的首选方法?

C——操作指针

c++ - 我可以在没有 Visual Studio 的情况下使用 Visual C++ 编译器吗?

java - 比较 if 语句中的原始 boolean 值

jquery - 日常使用的RightJS javascript库