我正在做一个循环来执行从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。
我的代码中的问题在哪里?
答案 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?