Algorithm 如何动态地找出浮点错误率?
由于机器难以准确表示浮点值,我们使用的是中的a技术来执行浮点比较:Algorithm 如何动态地找出浮点错误率?,algorithm,floating-point,Algorithm,Floating Point,由于机器难以准确表示浮点值,我们使用的是中的a技术来执行浮点比较: from the editor: please insert your code here. See HTML comment in the question source 目前,我们硬编码了“错误”值。但是不同机器的误差是不同的。有没有什么好办法来计算特定机器的错误,而不是硬编码公差?请参阅 该代码查找不能与零区分的最小正数。您可以根据需要调整它。决定双精度或浮点精度的“机器精度”通常标记为epsilon 如果我需要计算浮
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
ise=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,但在可能遇到的数字范围的边界值附近进行计算,然后使用略大于最大值的ε李>
- 验证第三点,这只是一种预感李>
1_000_000
,它是1.1641532182693481e-010
,对于1_000_000_000
,它是1.1920928955078125e-007
。