2010-02-02 244 views
1

(1)我遇到了一些情况,其中将epsilon添加到非负变量中以确保非零值。所以我想知道为什么不添加数据类型可代表的最小值而不是epsilon?这两个解决方案有什么区别? (2)另外我注意到,双精度类型的最大值的倒数大于其最小值,其最小值的倒数是inf,大于其最大值。计算其最大值和最小值的倒数是否有用? (3)对于非常小的双数类型的正数来计算它的倒数,当它的倒数开始没有意义时,它有多小?把倒数的上界设置好会更好吗?界限有多少?机器精度以及双精度型的最大值和最小值

感谢和问候加入

回答

2

您需要了解如何在CPU中表示浮点数。在数据类型中,为符号保留1位,即它是正数还是负数(是的,您可以在浮点数中有正数和负数0),那么为有效数字保留一些位(或尾数),这些是浮点数中的有效数字,最后为指数保留一些位。浮点数的值现在为:

-1^*号尾数* 2 ^指数

  1. 这意味着最小的号码是一个很小的值,即smalles尾数与指数最低。然而,舍入误差要大得多,取决于数量的大小,即具有给定指数的最小数。 epsilon是1.0和下一个可表示的较大值之间的差值。这就是为什么epsilon被用于对四舍五入错误有效的代码中的原因,并且如果你做得正确,你真的应该使用与你一起工作的数字的大小来扩展epsilon。最小的可表示值通常没有任何重要用途。

  2. 你会看到归一化和非规格化最小值之间的差异。问题在于,由于使用有效位的方式,有可能产生一个比正数更大的负指数,比如说有效位的位模式全部为零,除了最后一位以外,那么指数是有效的降低有效位数的位数。对于最大值你不能这样做,即使你设置有效位数为全部位数,有效指数仍然只是给出的指数。即考虑0.000001e-10和9.999999e + 10之间的差异,第一个比第二个大得多。第一个实际上是1e-16,而第二个是大约1e + 11。

  3. 它当然取决于浮点数的精度。在双精度情况下,最大值和下一个较小值之间的差异已经很大(沿着10^292的线),所以你的舍入误差将会非常大。如果这个值太小,你就会像你已经看到的那样简单地得到inf。真的,没有严格的答案,完全取决于你需要的数字的精确度。考虑到舍入误差约为ε*量级,(1 /ε)的倒数已经具有大约1.0的舍入误差,如果您需要数字精确到1e-3,那么即使ε也太大而无法被分割。

见一些背景资料上IEEE754Machine epsilon这些维基百科页面。

1
  1. Epsilons测试两个值应该是平等的,但由于舍入误差不平等。虽然你可以使用ε的最小正值,但它不会是最优的,因为它太小了。浮点运算引起的舍入误差几乎总是超过最小值,因此需要更大的epsilon。多大取决于你想要的准确度。

  2. 我不明白这个问题。互惠对于什么有用?我想不出为什么他们会有用。

  3. 一般来说,除以非常小的值是一个坏主意,因为它会导致非常大的舍入误差。我不确定你的意思是增加一个上限。只要尽可能避免用小数值除。

+0

谢谢Poita_。 3,请参阅我的最后一篇文章http://stackoverflow.com/questions/2185296/inverse-distance-weighted-value-and-machine-precision – Tim

4

小量

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 如果您使用的是定点数而不是浮点数。例如,有一段时间,不少人使用定点绘制各种图形。一个典型的版本是一个16位的整数,分解成小数点前的10位和小数点后的6位。这样的数字可以表示大约0到1024之间的数字,小数点后面有两位(十进制)数字。或者,您可以将其视为有符号的,从(粗略)-512到+512,再次运行小数点后两位数字。

在这种情况下,缩放因子是固定的,所以两个数之间可以表示的最小差异也是固定的 - 即1024和下一个较大数之间的差值与0和0之间的差值完全相同下一个更大的数字。

倒数

我不知道确切原因,您担心计算极大或极小的数字的倒数。 IEEE浮点使用非规范化,这意味着接近范围限制的数字将失去精度。基本上,一个数字被分成一个指数和一个有效数。指数包含数字的大小,而有效数字包含有效数字。每个都以指定的位数表示。在通常情况下,数字是正常化的,这意味着它们与我们在学校学到的科学记数法有些相似。在科学计数法中,您总是调整有效位数和指数,因此在小数点前有一个位置,所以(例如)140变为1.4e2,20030变为2.003e4,依此类推。

将此视为浮点数的“规格化”形式。然而,假设你限制了一个2位数的指数,所以它只能从-99到+99。另外假设您最多可以有15位有效数字。在这些限制内,您可以生成一个数字,如0.00001002e-99。这可以让您表示一个小于1e-99的数字,代价是会损失一些精度 - 而不是15位精度,您用有效数的5位数来表示数值,所以只剩下10位数字这真的很重要。

除了它是二进制而不是十进制,IEEE浮点大致这样工作。 当您接近范围的末尾时,数字的精度会越来越低,直到(在范围的最后)您只剩下一个精度位。

如果你把这个数字只有一位精度,并取其倒数,你会得到一个非常大的数字 - 但由于你只是以一位精度开始,所以结果只能有一位精度好。虽然稍好于没有结果,但它仍然非常接近毫无意义。你已经达到了位数可以表示的极限,解决问题的唯一方法是使用更多位。

实际上并没有任何一点指出倒数(或其他计算)“停止有意义”。一个结果是有道理的,而另一个结果是不合理的。相反,这是一个斜率,其中一个结果可能有15个数字的精度,另一个结果可能有10个,第三个只有1个。“有意义”与否主要是你如何解释结果。要获得有意义的结果,您需要对最终结果中有多少数字真正有意义有一个公平的想法。