c - c 中的 double 比较失败

标签 c floating-point double precision

<分区>

Possible Duplicate:
Why “for( i = 0.1 ; i != 1.0 ; i += 0.1)” doesn’t break at i = 1.0?

我有一个数字(实数)区间 [x, y]。我必须使用类似的方法遍历它:

nr = 0;
for (i = x; i <= y; i += step) //step is a small double value
    nr++;

对于步长为 0.001 的 [-1, 1],很明显 nr 应该是 2001 (-1.000 ... 0.999 1.000),但是它计算出 nr = 2000(我调查过,最后一次比较失败了:0.999 + 0.001 > 1.000)

如何计算准确的 nr 值?

最佳答案

您需要使用整数来执行此操作,或者对不精确感到满意,因为 float 和 double 本质上是不精确的*。您的代码完全按照 C 语言规范工作。在需要精确精度的情况下使用 float 和 double 是不安全的。

除此之外,您还需要在问题中提供有关您的要求的更多信息。如果 nr 是一个温度,那么要计算您需要使用不存在或不存在的物理学的确切值(我不是物理学家,所以我不能告诉你)。如果 step 实际上是一个不合理的值,那么您必须向上或向下舍入 - 您的调用以及哪个是正确的取决于您的业务逻辑要求。如果它是有理数并且不需要四舍五入,那么您需要乘以最小公分母并使用 int(或 C 等中的分数类)。

*如果您可以强制 stepy 符合您的问题,则当分数的分母是 2 的幂时,每个评论 float / double 是精确会有点清楚,但当然,如果 step 没有平均划分为 y,您将需要执行与上述完全相同的业务逻辑处理。

关于c - c 中的 double 比较失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13751639/

相关文章:

c - 将 float 除以 int 并存储为 float - 除以零

c# - 每次加倍带来不同的值(value)

string - 用 add 0.1 计算 double 给出了点后面的很多数字

php - 删除表1和表2关联的记录

c++ - 检测特定像素上的某种颜色并在检测到后发送点击的最快方法是什么?

c - 为什么C程序中调用线程数比执行线程数多?

java - float 组到字节数组,用于在 android 中的 Canvas 上显示位图

math - Golang 游学平方根

c - 为什么 sscanf 不填充变量?

将 int 转换为 4 字节 char 数组 (C)