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

upd*_*liu 10 c c++ floating-point ieee-754

假设t,a,b都是双(IEEE标准754)变量,而这两个值a,b都没有NaN(但可能Inf).之后t = a - b,我一定有a == b + t吗?

R..*_*R.. 25

绝对不.一个明显的例子是a=DBL_MAX,b=-DBL_MAX.那么t=INFINITY,b+t也是如此INFINITY.

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

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

  • @MSalters:"0x1p49"是十六进制浮点数,如C标准中所定义.格式为"0x"<有效数>> p"<指数>,其中<有效数>是十六进制数,可选地包括句点,<指数>是十进制数,可选地包括符号.指数的基数是2,所以0x1p49是2**49.0x1p-4将是1/16,而0x1.23p8将是(1 + 2/16 + 3/256)*2**8 = 291.十六进制浮点提供一种易于人类和编译器转换的格式进出二进制浮点编码,没有舍入问题. (8认同)