浮点比较精度
Floating point comparison precision
给定3个IEEE-754浮点a、b、c,它们不是+/-INF,也不是NaN,并且a<b、 假设a-c<b-c?或者,你能举一个不正确的例子吗?
假设a大约为0.00000000000000001,b约为0.0000000000000002,c为1。然后a−c和b−c都将等于−1.
(这是假设双精度,也就是64位的值。对于更高精度的值,您需要添加更多的零。)
编辑以添加解释:
如果我们忽略了非规范化值、非数字值和无穷大等,而只关注IEEE 754双精度浮点值,以便有一些具体的内容,那么—就二进制表示而言,浮点值由符号位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.0000000000000001这样的值和像1.000000000000002这样的值在小数点后的很多地方都是相同的—超过双精度有效位的位数。
当你在一个很大的数字和一个很小的数字之间进行加法或减法时(相对于彼此:在我们的例子中,1是"非常大";或者,我们可以使用1作为非常小的值,并选择一个非常大的值10000000000000000),得到的指数几乎完全由这个非常大的数字决定,并且必须适当地缩放非常小的数字的有效位。在我们的例子中,它被大约1017整除;所以它就这么消失了。有效位没有足够的位来区分它。
相关文章:
- 为什么我的比较运算符不比较我的点长和双精度值?
- 当两个相等的双精度的相对比较不起作用时,我该怎么办?
- 将双精度与整数进行比较
- 将 32 位浮点数和不强制转换的 32 位整数与双精度进行比较,当其中一个值可能太大而无法完全适合另一种类型时
- 将当前时间 simTime.dbl() 与以前存储的双精度值进行比较并不总是给出正确的答案......为什么?
- Xcode 错误:指针和双精度之间的比较
- 使用具有整数表示和 ULP 的混叠正确比较双精度
- 比较操作员的数值精度
- 关于在C/C++中比较整数和浮点/双精度
- 浮点比较精度
- C(++) 中双精度的排序/比较不稳定
- 比较两个双精度值但结果很奇怪
- 什么更贵?读取或比较整数,双精度
- 比较双精度和整数,不进行转换或转换
- 比较两个包含双精度的文件
- 两个双精度值的 C++ 比较无法正常工作
- 如何让数组将其值与双精度值进行比较
- 如何比较精度为5位的双精度数
- 比较双精度堆栈导致Always Equal
- 正、负两个双精度的比较