algorithm - 如何找到为每个 double 值产生较小输出的乘数?

标签 algorithm floating-point double multiplication ieee-754

您将如何找到最大且正的 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 .如果两个AAC处于“正常”区域那么指数是什么并不重要,情况与指数相同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/

相关文章:

Scala double 和精度

algorithm - 当我们有两个输出时的反向传播算法

c++ - 如何以素数为模计算非常大的二项式系数?

c++ - 红黑树删除算法(CLR第3版)

algorithm - 二维最大子数组

c++ - Int to Float to Int转换精度损失

c - 什么时候使用 CORDIC 或多项式近似更有效?

java - Java 中的 NaN 问题

c# - QT 中字节数组到 double 转换失败

c++ - C/C++ 中的定宽 float