什么时候可以保证IEEE浮点数(x ==(x + y)-y)或(x ==(x-y)+ y)?

时间:2019-01-16 11:50:40

标签: precision numeric ieee-754

在C或使用IEEE浮点数的另一种语言中,我有两个变量xy,它们都保证是有限的,非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,但是可以我假设如果将这些数字加在一起然后相减,反之亦然,我会再次获得第一个值吗?

此方面的正式条件是什么?

1 个答案:

答案 0 :(得分:0)

浮点流水线中的位数不是标准的一部分。

来自维基百科:

  

该标准还建议使用扩展格式来执行   内部计算的精度高于   最终结果,以最大程度地减少舍入误差:仅标准   规定了最低精度和指数要求   格式。 x87 80位扩展格式是最常见的格式   符合这些要求的扩展格式。

因此,由于内部格式可以扩展,不知道内部格式何时被截断为标准格式,因此使用了哪种舍入方法,因此不能保证先添加值然后再减去它的假设将导致原始值按照标准。

对于您发布的琐碎案例,它可能在大多数时间都适用。

然后是处理NAN的情况。

您也许可以确定当前使用的体系结构的边际情况,但仅检查当前值是否在原始值的误差范围内可能更容易。