假设IEEE 754具有任何精度,是否a / b - 1.0 > 0.0
用于所有有限浮点数a
和b
,其中a > b > 0
?这个编译器依赖吗?如何证明或证明此属性?下面的简短脚本返回true。
import numpy as np
arr = np.random.rand(1000000)
np.all((np.nextafter(arr, np.inf) / arr - 1) > 0.0)
答案 0 :(得分:4)
在通常的舍入法中,这是事实。不失一般性,假设1 <= a < 2
。如果是b < 1
,则取整为a/b = sum(i=0..infty) (1-b)^i a > a + (1-b)a >= a + ulp(a)/2 a
,round-to-even(a/b) > a
取整。因此我们可以假设1 <= b < a < 2
。您可以计算a/b = 1 + (a-b)/b > 1 + (a-b)/2 >= 1 + ulp(a)/2
,so round-to-even(a/b) > 1
。
答案 1 :(得分:1)
这是对existing answer的实验性补充。如果索赔确实失败,则两个不同的浮动汇率之间的比率应尽可能接近1.0。当它们之间的差异相对其大小尽可能小时,就会发生这种情况。
以2的每个幂,连续对之间的绝对距离加倍。有趣的情况是a
是2的幂,而下一个下浮点是b
。那是使用较小间隙尺寸的最大量值对。在Java中:
public strictfp class Test {
public static void main(String[] args) {
double a = 1.0;
double b = Math.nextDown(a);
System.out.println(a/b-1);
}
}
输出:
2.220446049250313E-16
答案 2 :(得分:1)
答案取决于所使用的舍入模式。这意味着以下三种舍入模式:
* Round Nearest Ties To Away
* Round Nearest Ties To Even
* Round Toward Positive
但以下两种舍入模式不成立:
* Round Toward Negative
* Round Toward Zero
作为Round Toward Zero
的反例,以:
a = 0x1.008084p-66
b = 0x1.008082p-66
其中a
和b
是单精度浮点数。然后除法精确地产生1.0
;因此违反了严格的大于要求。相同的值还提供了Round Toward Negative
的反例。