IEEE Std 754浮点:让t:= a – b,标准保证a == b + t吗?

假设tab都是双(IEEE Std 754)变量,并且ab两个值都不是NaN (但可以是Inf )。 在t = a - b ,我是否必须有a == b + t

绝对不。 一个明显的例子是a=DBL_MAXb=-DBL_MAX 。 那么t=INFINITY ,所以b+t也是INFINITY

更令人惊讶的是,有些情况下会发生这种情况而没有任何溢出。 基本上,它们都是ab不精确的forms。 例如,如果aDBL_EPSILON/4b-1 ,则ab是1(假设默认舍入模式),并且a-b+b则为0。

我提到第二个例子的原因是,这是在IEEE算法中强制舍入到特定精度的规范方法。 例如,如果您有一个在[0,1)范围内的数字并且想要强制将其四舍五入为4位精度,那么您将添加然后减去0x1p49

在执行第一个操作的过程中,位可能已从结果的低端丢失。 所以有一个问题是,第二次操作是否会完全重现这些损失? 我还没有完全想到这一点。

但是,当然,第一次操作可能溢出到+/-无穷大,使第二次操作不相等。

(当然,在一般情况下使用==浮点值几乎总是一个错误。)

使用花车时不保证任何东西。 如果两个数的指数不同,则算术运算的结果可能无法在浮点数中完全表示。

考虑以下代码:

 float a = 0.003f; float b = 10000000.0f; float t = a - b; float x = b + t; 

在Visual Studio 2010上运行,得到t==-10000000.0f ,因此x==0

在比较浮点数时,不应该使用相等。 而是将两个值之间的差值的绝对值与足够小的epsilon值进行比较,以满足您的精度需求。

它变得更加奇怪,因为不同的浮点实现可能会为同一操作返回不同的结果。