【发布时间】:2016-11-29 15:43:42
【问题描述】:
#include <iostream>
using namespace std;
int main() {
int steps=1000000000;
float s = 0;
for (int i=1;i<(steps+1);i++){
s += (i/2.0) ;
}
cout << s << endl;
}
将s 声明为float:9.0072e+15
将s 声明为double:2.5e+17(与在 Julia 中实现的结果相同)
我知道double 比float 具有双精度,但float 仍应处理高达 10^38 的数字。
我确实读过类似的主题,但结果不一样,但在那种情况下差异非常小,这里的差异是 25 倍。
我还补充说,使用long double 可以得到与double 相同的结果。如果问题是精度,我本来希望有一些不同的东西。
【问题讨论】:
-
您正在添加错误 1000000000 次。这是一个巨大的数字,所以大的偏差也不足为奇。
-
float mantissa 24 bits 表示
2^24 = 16777216以上的一些整数会有错误。因此,对于float,您添加了 1.7% + 一些中间数字而没有任何错误,其余部分偏离了轨道。 64 位浮点具有整数精度,53 位尾数最多为 9007199254740992,这超出了您的限制。 -
如果您想要浮点数的精确总和,请使用其他算法,例如 Kahan summation。