您将如何找到最大且正的 IEEE-754 二进制 64 值 C
,以便每个正的标准化二进制 64 值 A
的 IEEE-754 乘积C
小于 A
?
我知道它一定接近 0.999999...但我想找到最大的一个。
假设舍入到最近,关系到偶数。
最佳答案
已经有一些实验方法;这是 C = 1 - ε
的证明, 其中ε
是机器 epsilon(即 1
和大于 1
的最小可表示数之间的距离。)
我们知道C < 1
, 当然,所以尝试 C = 1 - ε/2
是有意义的因为它是下一个小于 1
的可表示数字. (ε/2
是因为 C
在可表示数字的 [0.5, 1)
桶中。)让我们看看它是否适用于所有 A
.
我将在本段中假设 1 <= A < 2
.如果两个A
和 AC
处于“正常”区域那么指数是什么并不重要,情况与指数相同2^0
.现在,选择 C
显然适用于 A=1
, 所以我们剩下的区域是 1 < A < 2
.看着A = 1 + ε
,我们看到 AC
(精确值,不是四舍五入的结果)已经大于 1;和 A = 2 - ε
我们看到它小于 2。这很重要,因为如果 AC
介于1和2之间,我们知道AC
之间的距离和 round(AC)
(也就是说,将其舍入到最接近的可表示值)最多为 ε/2
.现在,如果A - AC < ε/2
, 然后 round(AC) = A
这是我们不想要的。 (如果 A - AC = ε/2
那么它可能 鉴于正常 FP 舍入规则的“相等”部分,它舍入到 A
,但让我们看看我们是否可以做得更好。)既然我们选择了C = 1 - ε/2
, 我们可以看到 A - AC = A - A(1 - ε/2) = A * ε/2
.因为它大于 ε/2
(记住, A>1
),它离 A
足够远了远离它。
但是! A
的另一个值我们必须检查是最小可表示正常值,因为有 AC
不 在正常范围内,因此我们的“最近的相对距离”规则不适用。我们发现在那种情况下A-AC
恰好是该区域机器 epsilon 的一半。 “四舍五入到最近,偶数”开始,产品四舍五入等于A
.糟糕。
与 C = 1 - ε
经历同样的事情,我们看到 round(AC) < A
,而且没有什么比这更接近于 A
了。 (我们最终问是否 A * ε > ε/2
,当然是哪个)。所以重点是 C = 1-ε/2
几乎 可以工作,但是法线和非法线之间的界限把我们搞砸了,C = 1-ε
让我们进入端区。
关于algorithm - 如何找到为每个 double 值产生较小输出的乘数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51970756/