由于浮点和双精度有限而产生的误差

Error due to limited precision of float and double

本文关键字:误差 于浮点 双精度      更新时间:2023-10-16

在c++中,我使用以下代码来计算由于float和double精度有限而导致的错误的数量级:

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

(在double情况下,我所做的只是在第1行和第2行中将float与double交换)

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

Float  10^-8
Double 10^-17

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

Float  10^-20
Double 10^-20

这是什么原因?

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

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

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

2^-64 ~ 10^-20

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

Visual Studio也(默认情况下)将提升中间版本。但只能达到双精度

为什么不检查两个操作系统中float和double的大小呢?

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

根据c++规范,double必须至少和float一样大。如果您想知道系统上的类型有多大,请使用sizeof

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