使用float和double的差异非常大

Ant*_*llo 3 c++ precision

#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;
}
Run Code Online (Sandbox Code Playgroud)

声明sfloat:9.0072e + 15

声明sdouble:2.5e + 17(与Julia中实现的结果相同)

据我所知,它double具有双精度float,但float仍应处理高达10 ^ 38的数字.

我确实读过类似的主题,其结果不尽相同,但在那种情况下,差异非常小,这里差异是25倍.

我还补充说,使用long double而不是给我相同的结果double.如果事情是精确的,我会期望有一些不同的东西.

Han*_*son 5

问题是缺乏精确性:https://en.wikipedia.org/wiki/Floating_point

在1亿个数字后,您将1e8添加到1e16(或至少是该数量的数字),但单精度数字仅精确到7位数 - 因此它与添加0到1e16相同; 这就是为什么你的结果浮动相当低的原因.

在大多数情况下,首选双重浮动.