【发布时间】:2015-07-03 13:50:24
【问题描述】:
我最近创建了这个简单的程序来计算平均速度。
平均速度 = Δx / Δt
我选择 x 作为 t 的函数 x = t^2
因此v = 2t
另外,avg v = (x2 - x1) / (t2 - t1)
我选择的区间是 t = 1s to 4s。暗示 x 来自 1 to 16
因此 avg v = (16 - 1) / (4 - 1) = 5
现在的程序:
#include <iostream>
using namespace std;
int main() {
float t = 1, v = 0, sum = 0, n = 0; // t = time, v = velocity, sum = Sigma v, n = Sigma 1
float avgv = 0;
while( t <= 4 ) {
v = 2*t;
sum += v;
t += 0.0001;
n++;
}
avgv = sum/n;
cout << "\n----> " << avgv << " <----\n";
return 0;
}
我使用非常小的时间增量来计算很多时刻的速度。现在,如果 t 的增量为 0.001,则计算出的 avg v 为 4.99998。
现在,如果我将 t 的增量设为 0.0001,则 avg v 变为 5.00007!
进一步减少增量到 0.00001 得到 avg v = 5.00001
为什么会这样?
谢谢。
【问题讨论】:
-
请参阅stackoverflow.com/questions/588004/… 以了解为什么不能期望浮点数学产生精确结果。
-
从 float 更改为 double 并看到平均值正好是 5。这里的问题是 float 缺乏精度。见stackoverflow.com/questions/2100490/…。
-
计算机以二进制而非十进制工作。舍入错误和错误传播是您在使用浮点时应该(至少)注意的主题。这是您使用循环的代码,该循环将运行必要的次数:ideone.com/KTzKaP 请注意循环所需次数后的最终值。这是将
0.0001添加到浮点数 30,0001 次时发生的错误传播。由于0.0001不能以二进制形式精确表示,因此您会遇到问题。
标签: c++ optimization error-correction