浮点乘法的严格不等式

时间:2015-07-22 03:03:14

标签: floating-point floating-accuracy ieee-754

假设 a x y 是正的IEEE浮点数, x < ý。证明 a × x < a × y 其中× 表示浮点乘法舍入到最近。

天真地,您可能会认为某些 a x 接近 y , 你会得到 a × x = a × y 。事实证明这一点 不可能发生(只要非规范化的数字,无穷大和NaN都是 除外)。

我对优雅的证据感兴趣,如果可能的话,我还会对书籍或纸张感兴趣 这是给出的。

TAKE 2 :正如Pascal Cuoq的回复所示,上述陈述是 假。 y = 1的限制版本怎么样?这里是 要证明的陈述:

假设 a x 是正的IEEE浮点数 x < 1.证明 a × x < a 其中× 表示浮点乘法舍入到最近。

2 个答案:

答案 0 :(得分:6)

该属性为false,如下面的C99程序所示,当使用为doubleFLT_EVAL_METHOD = 0提供IEEE二进制64的编译器进行编译时:

#include <stdio.h>
#include <math.h>
#include <float.h>

int main(void) {
  double z = 1.0;
  double y = nextafter(z, 0.0);
  double x = nextafter(y, 0.0);
  double a = 1.0 + 2 * DBL_EPSILON;

  printf("%a %a\n", a*x, a*y);
}

结果:

0x1.0000000000001p+0 0x1.0000000000001p+0

y是1.0的前身,xy的前身,a是1.0后继者的后继者。 xy的值位于binade的顶部,其中相对精度最佳,a*xa*y的值位于他们的底部,相对精度最差。这就是a*xa*y四舍五入到相同值的方式。

问题中的属性看起来是正确的,因为反例只能在xy由单个ULP分隔并且a乘以Set<String> uniqueCategories; // global ...... uniqueCategories = new TreeSet<>(); for(Checkout c : checkOutArrayList) { uniqueCategories.add(c.getCategory()); } for (String strGlobalCategory : uniqueCategories) { System.out.println("Unique:"+strGlobalCategory); textVisible.setText(strGlobalCategory); // getting name of last Category only } 相对较低的情况下发生。目的地binade比原来的binade。

答案 1 :(得分:1)

为您修改后的问题提供正式证据(语言稍有改动):

  

假设ax是带有x < 1的正IEEE浮点数。证明[ax] < a []表示默认浮点舍入。

WLOG,让a进入[1, 2)。如果a1,则该声明非常正确,因此我们实际上只需要考虑a中的(1,2)x < 1表示x <= 1 - u/2,其中u = ulp(1) = ulp(a)。我们有:

ax <= a - au/2

我们还有a > 1,所以au/2 > u/2,所以:

ax <= a - au/2 < a - u/2

由于ax超过a [ax] < a以下的半个ulp,所以SomeUtility(arg => new MyType()); public void SomeUtility<T>(Func<object, T> converter) { var myType = converter("foo"); }