C++ 浮点比较精度
给定3个IEEE-754浮点a、b、c不是+/-INF,也不是NaN和a假设a约为0.00000000000000001,b约为0.00000000000000002,c为1。然后− c和b− c两者相等−一, (假设值为双精度,即64位。对于更高精度的值,您需要添加更多的零。)C++ 浮点比较精度,c++,c,floating-point,ieee-754,C++,C,Floating Point,Ieee 754,给定3个IEEE-754浮点a、b、c不是+/-INF,也不是NaN和a
编辑以添加解释: 如果我们忽略非规范化值、非数字值和无穷大等等,只是为了有具体的东西可以看,那么-就二进制表示而言,浮点值由符号位s(0表示正,1表示负)和11位指数e组成(偏移量为1023,因此e=0表示2−1023和e=1023表示20,即1),以及52位定点有效位m(表示二进制点后的52个位置,因此其范围为[0,1],精度有限)。因此,表示的实际值为(−1) s×(1+m)×2e−1023 因为有效位是定点的,并且具有固定的位数,所以精度是非常有限的。像1.00000000000000001这样的值和像1.00000000000000002这样的值在小数点后的很多位上是相同的-比双精度有效位可以容纳的位数还要多
当您在一个非常大的数字和一个非常小的数字之间执行加法或减法时(相对于彼此:在我们的示例中,1是“非常大”;或者,我们可以使用1作为非常小的值,并选择一个非常大的值100000000000000),得到的指数几乎完全由非常大的数字决定,非常小的数字的有效位必须进行适当的缩放。在我们的例子中,它被除以约1017;因此它就消失了。有效位没有足够的位来区分它。很快,谢谢:)不能还有,也许你可以快速解释一下为什么会发生这种情况IEEE 754 64位二进制浮点的指数范围是-1022(而不是-1024)到1023。(此外,分数部分正确地称为有效位,而不是尾数。)@埃里克:谢谢。我的解释写得太快了,除了你指出的以外,还有其他一些地方不太对劲。(例如,我用了一种“逻辑”符号
1
或-1
和一个“逻辑”符号。)指数这是一个有符号整数,但它可能更适合于0
或1
的实际符号位,以及必须减去1023
的按位指数。)啊,好吧。我认为这对于这个问题来说已经足够了,但我会考虑如何使它更精确。(或者,您可以自己编辑。)强制性链接: