可精确表示为浮点数/双精度数的整数范围

本文关键字:双精度 整数 范围 浮点数 表示 | 更新日期: 2023-09-27 18:05:53

可以表示为双精度数的(连续)整数的确切范围是多少?浮动?)我之所以问这个问题,是因为我对这样的问题很好奇,什么时候会出现准确性的损失。

  1. 使m+1不能精确表示为双精度数的最小正整数m是多少?浮动)?
  2. 使-n-1不能精确表示为双精度的最大负整数-n是多少?浮动)?(可同上)

这意味着-nm之间的每个整数都有一个精确的浮点表示。我基本上是在寻找范围[-n, m]为浮点数和双精度。

让我们将范围限制为标准的IEEE 754 32位和64位浮点表示。我知道浮点数有24位精度,双精度数有53位(都有一个隐藏的前导位),但由于浮点表示的复杂性,我正在寻找一个权威的答案。请不要挥手!

(理想答案是证明从0m的所有整数都是可表达的,而m+1是不可表达的)

可精确表示为浮点数/双精度数的整数范围

既然你问的是IEEE浮点类型,语言就无关紧要了。

#include <iostream>
using namespace std;
int main(){
    float f0 = 16777215.; // 2^24 - 1
    float f1 = 16777216.; // 2^24
    float f2 = 16777217.; // 2^24 + 1
    cout << (f0 == f1) << endl;
    cout << (f1 == f2) << endl;
    double d0 = 9007199254740991.; // 2^53 - 1
    double d1 = 9007199254740992.; // 2^53
    double d2 = 9007199254740993.; // 2^53 + 1
    cout << (d0 == d1) << endl;
    cout << (d1 == d2) << endl;
}
输出:

0
1
0
1

所以浮点数的极限是2^24。双精度的极限是2^53。