6

可以表示双精度(分别是浮点数)的(连续)整数的确切范围是多少?

那是

  1. 不能精确表示为双精度(分别是浮点数)的最小正整数m是多少?m+1
  2. 不能精确表示为双精度(分别是浮点数)的最大负整数-n是多少?-n-1(可能与上述相同)。

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

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

(理想的答案将证明从0to的所有整数m都是可表达的,但事实m+1并非如此。)

4

1 回答 1

7

由于您询问的是 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。负数是相同的,因为唯一的区别是符号位。

于 2013-03-26T17:15:36.917 回答