IEEE 64 位浮点数无法区分两个整数的第一个值是多少?
What is the first value at which a IEEE 64-bit float cannot distinguish two integers?
我指望 Double
(符合 IEEE 的 64 位浮点数)来跟踪一些非常大的数字。问题是我需要维护整数的单位分辨率(个位)。
问题是我知道,随着 IEEE 浮点值的增加,它们的精度会降低。我相信在某个时候,我们会得到这样的结果:
...
xxxxxxxxxxxxxxxxx04
xxxxxxxxxxxxxxxxx05
xxxxxxxxxxxxxxxxx06
xxxxxxxxxxxxxxxxx08
xxxxxxxxxxxxxxxxx10
...
有些整数根本无法表示。我想知道那个点在哪里,这样我就可以防范它,警告用户,或者制定公司政策。
请注意,我使用浮点数是有充分理由的;小数部分对应用程序也很重要,但远不如整数部分重要。
根据Wikipedia:
Any integer with absolute value less than 224 can be exactly represented in the single precision format, and any integer with absolute value less than 253 can be exactly represented in the double precision format. Furthermore, a wide range of powers of 2 times such a number can be represented. These properties are sometimes used for purely integer data, to get 53-bit integers on platforms that have double precision floats but only 32-bit integers.
强调我的
也就是说,IEEE 64 位整数精度的最高值是 9,007,199,254,740,992,次高的数字是 9,007,199,254,740,994。在您的问题格式中:
9007199254740990
9007199254740991
9007199254740992
9007199254740992
9007199254740994
9007199254740996
9007199254740996
请注意,一些浮点数到字符串的算法会像这样打印:
9007199254740990.0
9007199254740991.0
9007199254740992.0
9007199254740992.0
9.007199254740994e+15
9.007199254740996e+15
9.007199254740996e+15
IEEE-754 基本 64 位二进制浮点格式使用 53 位尾数。它编码的每个有限数的形式为 s • F • 2e,其中s(符号)为+1或-1,F(分数)为53-位二进制数字b.bbb…bbb(注意第一位后的“.”), e 是从 −1022 到 +1023 的指数。 (通常,浮点数 归一化 通过移位将第一个 1 位移动到前导 b 位置并调整指数以补偿. 对于可表示值的讨论,我们可以忽略这一点;所有用前导 0 表示的数字也可以用前导 1 表示,只要指数在范围内,这就是这个问题。)
这告诉我们回答问题所需的一切。从 0 到 253−1 的每个整数都可以用 +1 的形式表示 • b.bbb …bbb • 252 用于位值的某种组合 b. bbb…bbb。 253 可表示为 +1 • 1.000…000 • 253。但是 253+1 是不可表示的,因为它需要 1.000…0001 形式的 F,其中需要 54 位(第一个用于253 最后一个为 20).
之后,253+2是可表示的,因为跨越它的最高和最低1位只需要53位(从253 到 21)。所以,在这个量级,偶数是可表示的,而奇数不是。
因此,从连续可表示整数到不可表示整数的转换如下所示:
- 9,007,199,254,740,919 = 253−3 可表示。
- 9,007,199,254,740,920 = 253−2 可表示。
- 9,007,199,254,740,921 = 253−1 可表示。
- 9,007,199,254,740,922 = 253 可表示。
- 9,007,199,254,740,923 = 253+1 不可表示。
- 9,007,199,254,740,924 = 253+2 可表示。
- 9,007,199,254,740,925 = 253+3 不可表示。
- 9,007,199,254,740,926 = 253+4 可表示。
我指望 Double
(符合 IEEE 的 64 位浮点数)来跟踪一些非常大的数字。问题是我需要维护整数的单位分辨率(个位)。
问题是我知道,随着 IEEE 浮点值的增加,它们的精度会降低。我相信在某个时候,我们会得到这样的结果:
...
xxxxxxxxxxxxxxxxx04
xxxxxxxxxxxxxxxxx05
xxxxxxxxxxxxxxxxx06
xxxxxxxxxxxxxxxxx08
xxxxxxxxxxxxxxxxx10
...
有些整数根本无法表示。我想知道那个点在哪里,这样我就可以防范它,警告用户,或者制定公司政策。
请注意,我使用浮点数是有充分理由的;小数部分对应用程序也很重要,但远不如整数部分重要。
根据Wikipedia:
Any integer with absolute value less than 224 can be exactly represented in the single precision format, and any integer with absolute value less than 253 can be exactly represented in the double precision format. Furthermore, a wide range of powers of 2 times such a number can be represented. These properties are sometimes used for purely integer data, to get 53-bit integers on platforms that have double precision floats but only 32-bit integers.
强调我的
也就是说,IEEE 64 位整数精度的最高值是 9,007,199,254,740,992,次高的数字是 9,007,199,254,740,994。在您的问题格式中:
9007199254740990
9007199254740991
9007199254740992
9007199254740992
9007199254740994
9007199254740996
9007199254740996
请注意,一些浮点数到字符串的算法会像这样打印:
9007199254740990.0
9007199254740991.0
9007199254740992.0
9007199254740992.0
9.007199254740994e+15
9.007199254740996e+15
9.007199254740996e+15
IEEE-754 基本 64 位二进制浮点格式使用 53 位尾数。它编码的每个有限数的形式为 s • F • 2e,其中s(符号)为+1或-1,F(分数)为53-位二进制数字b.bbb…bbb(注意第一位后的“.”), e 是从 −1022 到 +1023 的指数。 (通常,浮点数 归一化 通过移位将第一个 1 位移动到前导 b 位置并调整指数以补偿. 对于可表示值的讨论,我们可以忽略这一点;所有用前导 0 表示的数字也可以用前导 1 表示,只要指数在范围内,这就是这个问题。)
这告诉我们回答问题所需的一切。从 0 到 253−1 的每个整数都可以用 +1 的形式表示 • b.bbb …bbb • 252 用于位值的某种组合 b. bbb…bbb。 253 可表示为 +1 • 1.000…000 • 253。但是 253+1 是不可表示的,因为它需要 1.000…0001 形式的 F,其中需要 54 位(第一个用于253 最后一个为 20).
之后,253+2是可表示的,因为跨越它的最高和最低1位只需要53位(从253 到 21)。所以,在这个量级,偶数是可表示的,而奇数不是。
因此,从连续可表示整数到不可表示整数的转换如下所示:
- 9,007,199,254,740,919 = 253−3 可表示。
- 9,007,199,254,740,920 = 253−2 可表示。
- 9,007,199,254,740,921 = 253−1 可表示。
- 9,007,199,254,740,922 = 253 可表示。
- 9,007,199,254,740,923 = 253+1 不可表示。
- 9,007,199,254,740,924 = 253+2 可表示。
- 9,007,199,254,740,925 = 253+3 不可表示。
- 9,007,199,254,740,926 = 253+4 可表示。