【发布时间】:2019-01-16 11:50:40
【问题描述】:
在 C 或其他使用 IEEE 浮点数的语言中,我有两个变量 x 和 y,它们都保证是有限的、非 NaN 的、基本上是正常的数字。
我有一些代码本质上假定以下代码无效:
float x = get_x ();
float y = get_y ();
float old_x = x;
x += y;
x -= y;
assert (old_x == x);
x -= y;
x += y;
assert (old_x == x);
我知道这对于某些类别的值是正确的,即尾数中没有“很多”有效数字的值,但我想清楚边缘情况。
例如,1.3 的二进制表达式在尾数下一直有有效数字,1.7 也是如此,我不应该完全假设 1.3+1.7==3,但我可以假设如果我添加把这些数字加在一起,然后减去它们,或者反之,我会再次取回第一个值吗?
什么是正式的边缘条件?
【问题讨论】:
-
很难看出知道这一点的用处,有时它会起作用,而你也知道在许多情况下它不会起作用。
-
二进制浮点的一个有用的充分条件是 Sterbenz 引理:如果 x/2 ≤ y ≤ 2x,x-y 是精确的(因此,如果 x/2 ≤ −y ≤ 2x,x+y 是确切。)我不记得看到所有确切案例的完整特征。我不认为“边缘”案例是一个很好的描述,因为我怀疑它们会有一些不规则性,例如数量级差异较大的数字比由于低位互补模式而差异较小的某些案例具有准确的结果.
标签: precision numeric ieee-754