<分区>
当我编写一个需要时间数组的小 ODE 求解器时,我最终遇到了以下非常奇怪的行为。以下代码应该可以清楚地重现问题。
#include <iostream>
using namespace std;
int main() {
double t = 0.0;
for (t = 0.0; t <= 1.00; t += 0.01) {
cout << t << " ";
}
cout << endl;
cout << "t = "<< t << " and t <= 1.00? " << (t <= 1.00) << endl;
double c = 1.00;
cout << "c = "<< c << " and c <= 1.00? " << (c <= 1.00) << endl;
cout << "t == 1.00? " << (t == 1.00) << " and c == 1.00? " << (c == 1.00) << endl;
return 0;
}
这给出了以下输出:
0 0.01 0.02 0.03 0.04 ... 0.97 0.98 0.99
t = 1 and t <= 1.00? 0
c = 1 and c <= 1.00? 1
t == 1.00? 0 and c == 1.00? 1
我的问题是:为什么 (t <= 1.00) 和 (t == 1.00) 返回 false 而 t 显然应该等于 1 并且 t 是 double 类型?
我无法真正避免这个问题,因为在我的真实代码中,我的 t-step 不是硬编码等...
先谢谢你。
编辑:感谢您的回答。这确实是 0.01 等的二进制表示不准确但有一定舍入误差的问题。 t 标度实际上是由程序中的其他物理量强制执行的。同时,我在其他地方得到的另一个答案/提示是,如果需要使用浮点成员,则始终使用容差。在这种情况下,当我的应用程序需要使用可变精度 h 时,“t <= 1.00”可能会变成“t < 1.00 + 0.01/2”或更一般的“t < 1.00 + h/2”。