从 0 到 N-1 的最大整数范围是多少,可以由 [0, 1] 范围内的 IEEE 754 双精度浮点值表示?

What is the largest integer range from 0 to N-1 that can be represented by an IEEE 754 double-precision floating point value in the range [0, 1)?

提问人: 提问时间:6/13/2023 更新时间:6/14/2023 访问量:55

问:

如果我们通过将浮点范围乘以整数值来将双精度浮点范围映射到整数范围,那么在截断/下限结果为整数时表示所有数字的最大数字是多少?没有扩展精度乘法。N 四舍五入为可表示的值。[0, 1)[0-N)NN[0-N)float_value * N

浮点 IEEE-754

评论

0赞 6/13/2023
乘法运算@EricPostpischil保证 [0, 1) 中的任何双精度浮点数乘以 2^53+1 时实际上可以计算 [0, 2^53] 范围内的所有整数,还是会有空洞?
0赞 6/13/2023
没有扩展精度乘法。N 四舍五入为可表示的值。
0赞 chux - Reinstate Monica 6/13/2023
@UltimateHawk 最好添加约束,例如无扩展精度乘法。N 四舍五入为问题的(双精度)可表示值
0赞 vinc17 6/14/2023
2^53 显然有效。如果 N 大于 2^53,则 N ⩾ 2^53 + 1 和 2^53 + 1 ∈ [0,N] 不能完全表示。因此,任何 N > 2^53 都会失败。这比埃里克的答案要简单得多。或者 [0,N],您的意思是“[0,N] 的所有浮点数也是整数”(因此不包括不能完全表示的整数)?

答:

1赞 Eric Postpischil 6/14/2023 #1

首先,考虑 N = 253。对于每个整数 k ∊ [0, 2 53],k/2 53 在 IEEE-754 双精度 (binary64) 中可以表示为 +k•2−53,因为 binary64 中可表示的每个数字都可以描述为一个符号和一个53 位整数乘以 2, 2 e 的幂,对于整数幂 e ∊ [−1074, +972]。每个这样的 k/253 都在 [0, 1) 中,并且每个这样的 k/2 53 乘以 N (253) 的浮点乘法不会产生舍入误差,从而产生正好 k因此,[0, N) 中的每个整数都由 [0, 1] 中的至少一个 binary64 数字映射到。

N 不能是 2 53+1,因为它不可表示(它需要 54 位来表示,而 binary64 有效只有53 位)。对于较大的 N,整数 253+1 位于 [0, N) 中,但不能是任何 binary64 乘法的结果,因为它不可表示。

因此,253 是满足问题约束的 N 的最大值。

评论

0赞 vinc17 6/14/2023
这比必要的要复杂得多(如果我正确理解了这个问题)。对于第二部分,请注意,如果 N > 2^53,则 2^53 + 1 ∈ [0,N],并且这个数字不能精确表示,因此不能是乘法的结果。因此,这不包括任何 N > 2^53。
0赞 6/15/2023
您能否更详细地介绍一下“......不会产生舍入误差,正好产生 k。这怎么知道呢?
0赞 Eric Postpischil 6/15/2023
@UltimateHawk:浮点运算只有在数学结果不能以浮点格式表示时才会对数学结果进行舍入。当 k 是 [0, 2^53] 中的整数时,k / 2 ^53 和 2^53 的乘积总是可表示的,因为它是 k,它适合 53 位符号。所以没有四舍五入。