浮点比较精度

时间:2012-11-16 15:41:19

标签: c++ c floating-point ieee-754

给出3个IEEE-754浮点数a,b,c,它们不是+/- INF而不是NaN且a <1。 b,假设a - c <1是安全的吗? b - c? 或者,如果这不正确,你能给出一个例子吗?

1 个答案:

答案 0 :(得分:11)

假设 a 约为0.00000000000000001, b 约为0.00000000000000002,而 c 为1.则 a - c b - c 都等于-1。

(假设是双精度,a.k.a。64位,值。对于更高精度的值,你需要添加更多的零。)


编辑添加解释:

如果我们忽略非规范化值而不是数值和无穷大等等,并且只是为了具体的东西而专注于IEEE 754 double-precision floating-point value,那么 - 就二进制表示而言,浮点值包含一个符号位 s (0表示正数,1表示负数),11位指数 e (偏移量为1023,这样 e = 0表示2 -1023 e = 1023表示2 0 ,即1),和52 -bit定点有效数 m (表示超过二进制点的52个位置,因此它的范围从[0,1]到有限精度)。因此,表示的实际值为(-1) s ×(1 + m )×2 e < / EM> -1023

因为有效位数是定点的,并且具有固定的位数,所以精度非常有限。类似于1.00000000000000001的值和类似于1.00000000000000002的值对于超过小数的很多位置是相同的 - 比双精度有效位数可以容纳的位数更多。

当你在非常大的数字和非常小的数字之间进行加法或减法时(相对于彼此:在我们的例子中,1是“非常大”;或者,我们可以使用1作为非常小的值并选择非常大的值10000000000000000),得到的指数几乎完全由非常大的数确定,并且非常小的数的有效数必须适当地缩放。在我们的例子中,它除以约10 17 ;所以它就会消失。有效数字没有足够的位来区分它。