如何动态找出浮点错误率?

时间:2009-08-11 03:25:28

标签: algorithm floating-point

由于机器难以准确表示浮点值,我们使用Write Great Code: Understanding the machine中的一种技术来执行浮点比较:

from the editor: please insert your code here. See HTML comment in the question source 

目前,我们对“错误”值进行了硬编码。但是不同机器的错误是不同的。有没有什么好方法可以找出特定机器的错误,而不是硬编码容差?

4 个答案:

答案 0 :(得分:4)

请参阅my answerWhat’s the smallest non-zero, positive floating-point number in Perl?

该代码找到无法与零区分开的最小正数。您可以根据自己的需要进行调整。

答案 1 :(得分:3)

对于64位IEEE 754浮点数,1.0 + e != 1.0e = 2.2204460492503131e-016的最小数字。 (DBL_EPSILON在float.h中的C中,std::numeric_limits<double>().epsilon()<limits>中的C ++中)。我认为您的代码不太可能在本机浮点格式不是64位IEEE 754的任何系统上运行。

请注意,绝对精度实际上会根据您正在处理的数字大小而变化。使用非正规值,您可以使用非常小的值,因此1e-300 + 2e-300可以正常工作,但1 + 1e-300 == 1。同样1e30 + 1 == 1e30

答案 2 :(得分:3)

我通常会在系统中确定我想要的精度,而不必担心我可用的精度。这在我遇到的大多数情况下都能正常工作。我能想到的这种方法的一些优点是

  • 它让我专注于我想要更快解决的问题。
  • 我不必花时间去弄清楚epsilon!
  • 也是,这是一个重点:epsilon会根据您在数字系统中的位置而变化。 epsilon在0附近是不同的,并且接近不同,比如说2 ^ 300.所以要真正插入epsilon,你还需要知道你试图找出epsilon的数字范围。我建议使用 Sinan Unur's答案,但要在您可能遇到的数字范围的边界值附近进行计算,然后使用略大于最大值的epsilon。
  • 验证第三点,它只是一个预感!

答案 3 :(得分:1)

决定双精度或浮点精度的“机器精度”通常标记为epsilon

如果我需要计算浮点数的精度,我通常会做这样的事情*:

float number = 1.0;      // precision of this number
float epsilon = 1.0;

while ((number + epsilon) != number)
{
    epsilon /= 2.0f;
}

(*这不在我的脑海中。请勿在未经检查的情况下使用此代码。)

但是有一些方法可以确定机器属性的精确精度。

以下是一篇关于代码示例How to determine the machine epsilon的文章。

另一个在这里:Floating Point: Machine Precision用理论和方程来计算epsilon。

享受,

Robert C. Cartaino