可以精确表示为浮点数/双精度的整数范围
什么是(连续的)整数的确切范围,可以表示为double(相应的浮点数?)我问的原因是因为我对这样的问题感到好奇,因为会发生精度损失。
那是
- 什么是最小正整数
m
,使得m+1
不能精确表示为double(相应的浮点数)? - 什么是最大的负整数
-n
使得-n-1
不能精确地表示为double(resp.lov)? (可能与上面相同)。
这意味着-n
和m
之间的每个整数都具有精确的浮点表示。 我基本上都在寻找浮点数和双打数的范围[-n, m]
。
让我们将范围限制为标准IEEE 754 32位和64位浮点表示。 我知道浮点数有24位精度,双精度数有53位(都带有隐藏的前导位),但由于浮点表示的复杂性,我正在寻找一个权威的答案。 请不要挥手!
(理想的答案将certificate从0
到m
所有整数都是可表达的,并且m+1
不是。)
由于您询问IEEE浮点类型,因此语言并不重要。
#include 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。 负数是相同的,因为唯一的区别是符号位。