在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
,但是可以我假设如果将这些数字加在一起然后相减,反之亦然,我会再次获得第一个值吗?
此方面的正式条件是什么?
答案 0 :(得分:0)
浮点流水线中的位数不是标准的一部分。
来自维基百科:
该标准还建议使用扩展格式来执行 内部计算的精度高于 最终结果,以最大程度地减少舍入误差:仅标准 规定了最低精度和指数要求 格式。 x87 80位扩展格式是最常见的格式 符合这些要求的扩展格式。
因此,由于内部格式可以扩展,不知道内部格式何时被截断为标准格式,因此使用了哪种舍入方法,因此不能保证先添加值然后再减去它的假设将导致原始值按照标准。
对于您发布的琐碎案例,它可能在大多数时间都适用。
然后是处理NAN的情况。
您也许可以确定当前使用的体系结构的边际情况,但仅检查当前值是否在原始值的误差范围内可能更容易。