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

Algorithm 如何动态地找出浮点错误率?,algorithm,floating-point,Algorithm,Floating Point,由于机器难以准确表示浮点值,我们使用的是中的a技术来执行浮点比较: from the editor: please insert your code here. See HTML comment in the question source 目前,我们硬编码了“错误”值。但是不同机器的误差是不同的。有没有什么好办法来计算特定机器的错误,而不是硬编码公差?请参阅 该代码查找不能与零区分的最小正数。您可以根据需要调整它。决定双精度或浮点精度的“机器精度”通常标记为epsilon 如果我需要计算浮

由于机器难以准确表示浮点值,我们使用的是中的a技术来执行浮点比较:

from the editor: please insert your code here. See HTML comment in the question source 
目前,我们硬编码了“错误”值。但是不同机器的误差是不同的。有没有什么好办法来计算特定机器的错误,而不是硬编码公差?

请参阅

该代码查找不能与零区分的最小正数。您可以根据需要调整它。

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

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

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

while ((number + epsilon) != number)
{
    epsilon /= 2.0f;
}
(*这太离谱了。未经检查,请勿使用此代码。)

但是,考虑到机器的性能,有一些方法可以确定精确的精度

下面是一篇关于代码示例的文章


这里还有一个:用理论和方程来计算ε。

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


请注意,绝对精度实际上会根据所处理的数字的大小而变化。使用非规范化时,操作的值非常小,因此
1e-300+2e-300
可以工作,但
1+1e-300==1
。类似地,
1e30+1==1e30

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

  • 它让我能够集中精力更快地解决问题
  • 我不必花时间去计算ε
  • 还有一点很重要:ε的变化取决于你在数字系统中的位置。ε在0附近不同,在2^300附近不同。所以要插入一个epsilon,你还需要知道你想要计算epsilon的数字范围。我建议使用answer,但在可能遇到的数字范围的边界值附近进行计算,然后使用略大于最大值的ε
  • 验证第三点,这只是一种预感
在边缘情况下,我们是否可能进入无限循环?虽然乍一看似乎不是。这似乎是“近似的”,而不是“精确的”。@Yan Cheng Cheok我不是数值分析师,我不知道所有种类的浮点数学的所有复杂性,但我不这么认为,因为浮点数只能代表有限数目的值。如果您使用的是十进制浮点(不太可能,但可能),那么您应该除以10。@Yan Cheng Cheok如果您使用的是二进制浮点,它将是精确的。即使他们将来制造一个超级复制器无限精确的CPU,您也可以通过计算迭代次数并在一段时间后中断来避免无限循环(我想60-70次迭代就足够了)。是的,ε确实取决于考虑中的数字。对于
1_000_000
,它是
1.1641532182693481e-010
,对于
1_000_000_000
,它是
1.1920928955078125e-007