由于float和double的精度有限而导致错误

时间:2011-10-09 07:59:44

标签: c++ floating-accuracy double-precision

在C ++中,由于float和double的精度有限,我使用下面的代码来计算出错误的数量级:

 float n=1;
 float dec  = 1;

 while(n!=(n-dec)) {
    dec = dec/10;
 }
 cout << dec << endl;

(在双重案例中,我所做的只是在第1行和第2行交换浮点数)

现在,当我在Unix系统上使用g ++编译并运行它时,结果是

Float  10^-8
Double 10^-17

但是,当我在Windows 7上使用MinGW编译并运行它时,结果是

Float  10^-20
Double 10^-20

这是什么原因?

3 个答案:

答案 0 :(得分:2)

我想我会将我的评论作为答案并进行扩展。 这是我的假设,我可能错了。

Windows上的MinGW可能试图通过将表达式的中间词提升到x86的完整80位精度来保持精度。

因此,表达式n != (n-dec)的两边都被评估为64位精度(80位FP具有64位尾数)。

2^-64 ~ 10^-20

所以这些数字是有意义的。

Visual Studio(默认情况下)也将推广中间体。但只有双精度。

答案 1 :(得分:0)

为什么不在两个操作系统中检查float的大小和双倍?

答案 2 :(得分:0)

这只是表明不同的环境对float和double使用不同的大小。

根据C ++规范,double必须至少与float一样大。如果您想了解系统中类型的大小,请使用sizeof

您的测试似乎表明,g ++对float和double使用不同的大小(分别为32位和64位),而Windows系统上的MinGW32使用相同的大小。这两个版本都符合标准,一般都不能依赖这两种行为。