对于C ++中的次要或相同条件

时间:2017-10-27 11:18:23

标签: c++ for-loop compare

我正在做一个循环来执行从t = 0到t = 1(包括)的一些计算。

这应该很容易:

for(double t = 0; t<=1; t = t + 0.05)
{
DEBUG_LOG1 (LVL1, t);
//DoMaths
}

但由于某种原因,t从0记录到0.95,不包括t = 1,因为它是t <1而不是t <= 1。

我的代码中的问题在哪里?

3 个答案:

答案 0 :(得分:4)

这是类型的简单问题。因为它是一个浮点数,很可能永远不会得到精确的0.05或1.00。 相反,你会尝试0.05,但实际上会像0.050000000000000012这样加起来20次不是1但更像是1.00000000000000024,因此不会与1对应。

您的代码本身没有问题,因为您通过使用&lt; =而不是=来解决问题。

您可以在http://www.learncpp.com/cpp-tutorial/25-floating-point-numbers/

上阅读有关浮点数的更多信息

答案 1 :(得分:1)

我认为这可能是因为0.05不能完全表示为浮点值。这只是近似的。尝试运行此程序。

#include <stdio.h>

int main()
{
    double x = 0.05;
    printf("%.50lf\n", x);
    return 0;
}

在这里,我告诉printf给我很多精确度。这会打印出值

  

0.05000000000000000277555756156289135105907917022705。

现在,如果我取出该值并乘以并在循环中将其加到其中的19次,我得到......

  

1.00000000000000022204460492503130808472633361816406

看看它不完全是1但略高。这就是比较浮点数之间的平等导致奇怪结果的原因。你可以通过添加一个小的epsilon来解决这个问题。例如,比较你的循环中的1.001。

答案 2 :(得分:1)

使用浮动类型无法准确表示十进制数字。例如,0.05无法在double类型中准确表示,具体取决于平台:0.050000000000000003或类似情况。所以你的循环中总会添加一点点。当您认为它是0.95时,它实际上是0.95000000000000029或类似的,并且添加0.05使其大于1,因此观察到的结果。有关此SO帖子中主题的更多信息:
Is floating point math broken?