假设 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 其中× 表示浮点乘法舍入到最近。
答案 0 :(得分:6)
该属性为false,如下面的C99程序所示,当使用为double
和FLT_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的前身,x
是y
的前身,a
是1.0后继者的后继者。 x
和y
的值位于binade的顶部,其中相对精度最佳,a*x
和a*y
的值位于他们的底部,相对精度最差。这就是a*x
和a*y
四舍五入到相同值的方式。
问题中的属性看起来是正确的,因为反例只能在x
和y
由单个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)
为您修改后的问题提供正式证据(语言稍有改动):
假设
a
和x
是带有x < 1
的正IEEE浮点数。证明[ax] < a
[]
表示默认浮点舍入。
WLOG,让a
进入[1, 2)
。如果a
为1
,则该声明非常正确,因此我们实际上只需要考虑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");
}
。