厄普西隆
Epsilon 是可与 1.0 相加并产生可与 1.0 区分开的结果的最小值。正如 Poita_ 暗示的那样,这对于处理舍入错误很有用。情况很简单:一个普通的浮点数的精度是固定的,不管数字的大小。换句话说,它总是计算相同数量的有效数字。例如,double 的典型实现将有大约 15 个有效数字(转换为 Epsilon = ~1e-15)。如果您正在使用 10e-200 范围内的数字,它可以表示的最小变化将在 10e-215 左右。如果您使用的是 10e+200 范围内的数字,它可以表示的最小变化将在 1e+185 左右。
有效地使用 Epsilon 通常需要将其缩放到您正在使用的数字的范围内,并使用它来定义您愿意接受的范围,这可能是由于舍入错误,所以如果两个数字在该范围内范围,你假设他们可能真的是平等的。例如,对于 1e-15 的 Epsilon,您可能决定将 1e-14 范围内的数字视为相等(即,有效数字已被舍入丢失)。
可以表示的最小数字通常会大大小于该数字。使用相同的典型double,它通常会在 1e-308 左右。这相当于 Epsilon if 您使用的是定点数而不是浮点数。例如,曾经有不少人将定点用于各种图形。一个典型的版本是一个 16 位整数,分成小数点前 10 位和小数点后 6 位。这样的数字可以表示大约从 0 到 1024 的数字,小数点后大约有两个(十进制)数字。或者,您可以将其视为有符号,从(大约)-512 到 +512,同样在小数点后保留两位数。
在这种情况下,缩放因子是固定的,因此两个数字之间可以表示的最小差异也是固定的——即 1024 和下一个更大的数字之间的差异与 0 和下一个更大的数字。
倒数
我不确定您究竟为什么关心计算极大或极小数字的倒数。 IEEE 浮点使用非规范化,这意味着接近范围限制的数字会失去精度。基本上,一个数字分为指数和有效数字。指数包含数字的大小,有效数字包含有效数字。每个都用指定的位数表示。在通常情况下,数字是标准化的,这意味着它们与我们在学校都学过的科学记数法有点相似。在科学计数法中,您总是调整有效数和指数,使小数点前只有一位,因此(例如)140 变为 1.4e2,20030 变为 2.003e4,以此类推。
将此视为浮点数的“标准化”形式。但是,假设您被限制为具有 2 位数字的指数,因此它只能从 -99 运行到 +99。还假设您最多可以有 15 个有效数字。在这些限制内,您可以生成像 0.00001002e-99 这样的数字。这使您可以表示小于 1e-99 的数字,但会损失一些精度 - 而不是 15 位精度,您使用 5 位有效数字来表示幅度,因此您只剩下 10 位数字这真的很重要。
除了它是二进制而不是十进制之外,IEEE 浮点的工作方式大致如此。
当您接近范围的末端时,数字的精度越来越低,直到(在范围的最末端)您只剩下一点精度。
如果你取那个只有一位精度的数字,然后取它的倒数,你会得到一个非常大的数字 - 但由于你只从一位精度开始,结果也只能有一位精度.虽然比没有结果略好,但它仍然非常接近毫无意义。您已经达到了位数可以表示的限制;解决这个问题的唯一方法是使用更多位。
倒数(或其他计算)实际上没有任何一点“不再有意义”。在一个结果有意义而另一个没有意义的情况下,这并不是一条真正的强硬路线。相反,它是一个斜率,其中一个结果可能有 15 位精度,另一个 10 位和三分之一只有 1 位。“有意义”与否主要是您如何解释该结果。要获得有意义的结果,您需要清楚地了解最终结果中有多少位是真正有意义的。