浮点比较精度

Floating point comparison precision

本文关键字:精度 比较      更新时间:2023-10-16

给定3个IEEE-754浮点a、b、c,它们不是+/-INF,也不是NaN,并且a<b、 假设a-c<b-c?或者,你能举一个不正确的例子吗?

假设a大约为0.00000000000000001,b约为0.0000000000000002,c为1。然后acbc都将等于−1.

(这是假设双精度,也就是64位的值。对于更高精度的值,您需要添加更多的零。)


编辑以添加解释:

如果我们忽略了非规范化值、非数字值和无穷大等,而只关注IEEE 754双精度浮点值,以便有一些具体的内容,那么—就二进制表示而言,浮点值由符号位s(0表示正,1表示负)、11位指数e组成(偏移量为1023,使得e=0表示2&减去1023e-=1023表示20(即1),和一个52位定点有效位m(表示二进制点后的52位,因此其范围为[0,1),精度有限)。因此,表示的实际值为(1)s&次;(1)+m)&次;2e−1023

因为有效位是定点的,并且有固定的位数,所以精度是非常有限的。像1.0000000000000001这样的值和像1.000000000000002这样的值在小数点后的很多地方都是相同的—超过双精度有效位的位数。

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