由于机器难以准确表示浮点值,我们使用Write Great Code: Understanding the machine中的一种技术来执行浮点比较:
from the editor: please insert your code here. See HTML comment in the question source
目前,我们对“错误”值进行了硬编码。但是不同机器的错误是不同的。有没有什么好方法可以找出特定机器的错误,而不是硬编码容差?
答案 0 :(得分:4)
请参阅my answer至What’s the smallest non-zero, positive floating-point number in Perl?。
该代码找到无法与零区分开的最小正数。您可以根据自己的需要进行调整。
答案 1 :(得分:3)
对于64位IEEE 754浮点数,1.0 + e != 1.0
为e = 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)
我通常会在系统中确定我想要的精度,而不必担心我可用的精度。这在我遇到的大多数情况下都能正常工作。我能想到的这种方法的一些优点是
答案 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