什么是比FLT_EPSILON小的最大数字?

时间:2012-01-31 01:11:44

标签: c floating-point floating-accuracy

在使用float.h的C中我想知道如何找到最大数字,如果我加1,答案将保持为1。

即1 + x = 1如何找到x?

2 个答案:

答案 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.)