在使用float.h的C中我想知道如何找到最大数字,如果我加1,答案将保持为1。
即1 + x = 1如何找到x?
答案 0 :(得分:8)
如果您想要“小于FLT_EPSILON的最大数字”:
x = nextafterf(FLT_EPSILON, 0)
如果您希望x
的最大数量为1.0f + x == 1.0f
,则答案取决于舍入模式,但在默认舍入模式下,它只是FLT_EPSILON/2
。
但事情并非如此简单。由于关系上甚至邻居的四舍五入到最接近的方式,你有1.0f + FLT_EPSILON/2 == 1.0f
,但是:
(1.0f+FLT_EPSILON) + FLT_EPSILON/2 != (1.0f+FLT_EPSILON)
因此,您可能希望使用稍微小一点的x
:
x = nextafterf(FLT_EPSILON/2, 0)
这将确保任何y+x == y
的{{1}}。
答案 1 :(得分:3)
这取决于舍入模式。这是一个简单的例子。假设我们的精度是4位,我们有某种IEEE754表示。因此值1存储为1.0000×2 0 。下一个更大的数字是1.0001×2 0 ,机器epsilonε定义为两者之间的差值,即0.0001×2 0 = 1.0000×2 -4 。现在:
ε/ 2 = 1.0000×2 -5 = 0.00001,
ε/ 4 = 1.0000×2 -6 = 0.000001
当您将两者中的一个添加到1时,首先会为电源2 0 重写数字,并在分隔符后四舍五入为4位数。幸存的尾数ε/ 4肯定是0.0000,而ε/ 2的幸存尾数是0.0000或0.0001,这取决于你是向上还是向下。
只要有效的尾数为0.0000,您可以将数字添加到1而不更改其值。
(对于单精度,双精度和双精度浮点数,实际精度为23 + 1,52 + 1和64.)