浮点数:如果a> b,则为a / b-1> 0

时间:2019-08-06 12:18:27

标签: floating-point

假设IEEE 754具有任何精度,是否a / b - 1.0 > 0.0用于所有有限浮点数ab,其中a > b > 0?这个编译器依赖吗?如何证明或证明此属性?下面的简短脚本返回true。

import numpy as np
arr = np.random.rand(1000000)
np.all((np.nextafter(arr, np.inf) / arr - 1) > 0.0)

3 个答案:

答案 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 around-to-even(a/b) > a取整。因此我们可以假设1 <= b < a < 2。您可以计算a/b = 1 + (a-b)/b > 1 + (a-b)/2 >= 1 + ulp(a)/2so 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

其中ab是单精度浮点数。然后除法精确地产生1.0;因此违反了严格的大于要求。相同的值还提供了Round Toward Negative的反例。