Answers:
Epsilon数学和工程学
在数学和工程学方面:
epsilon似乎更适合您的情况。
Epsilon计算机科学
特别是在计算机科学中,“ε”一词也指机器espilon,它测量1.0f
和最小地大于的浮子之间的差1.0f
。后一个数字1.00000011920928955078125f
用于Java中的float,可以通过以下方式计算:
float f = Float.intBitsToFloat(Float.floatToIntBits(1f) + 1);
机器epsilon的定义与上述epsilon的一般用法一致。
比较浮点数
但是请注意,在比较浮点数的“接近度”之前,您需要了解它们的比例。两个非常大且据说非常不同的浮点数可以相等:
9223372036854775808f == 9223372036854775808f + 1000000000f; //this is true!
相反,在两个小的浮子之间可能有许多可能的浮子值(和几个数量级),它们之间的差值仅取决于机器epsilon。在下面的示例中,存在10,000,000之间可用的浮点值small
和f
,但它们的区别在于仍远低于机器最小:
float small = Float.MIN_VALUE; // small = 1.4E-45
float f = Float.intBitsToFloat(Float.floatToIntBits(small) + 100000000); // f = 2.3122343E-35
boolean b = (f - small < 0.00000011920928955078125f); //true!
GlenH7的答案中链接的文章进一步研究了浮点比较,并提出了克服这些问题的几种解决方案。
要直接回答您的问题,您需要使用术语epsilon
。更准确地说,它是machine epsilon
常用的用法,但会删除“ machine”而只是使用epsilon
。
在我的本地副本中,float.h
我看到:
#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define LDBL_EPSILON DBL_EPSILON /* smallest such that 1.0+LDBL_EPSILON != 1.0 */
并且相关的注释清楚地表明epsilon是您所指的术语。
但是,我们也可以依靠其他一些外部参考来验证该epsilon
术语是否正确。看到这里,这里,这里,最后是SO查询标记的这种组合。我找不到直接引用IEEE 754标准的参考。
看一下Valve的Bruce Dawson撰写的有关比较浮点值的博客文章,以了解为什么您不想使用建议的比较。
该文章中包含很多信息,但这是此处最相关的摘录:
如果比较浮点数是否相等是一个坏主意,那么如何检查它们的差值是否在某个误差范围或epsilon值之内,如下所示:
bool isEqual = fabs(f1 – f2) <= epsilon;
通过此计算,我们可以表达两个浮点足够接近的概念,以使我们希望它们相等。但是我们应该为epsilon使用什么值?
鉴于上面的实验,我们可能会想在总和中使用误差,大约为1.19e-7f。实际上,float.h中甚至有一个具有确切值的定义,它称为FLT_EPSILON。
显然就是这样。头文件真让人发声,FLT_EPSILON是一个真正的epsilon!
除了那是垃圾。对于介于1.0和2.0之间的数字,FLT_EPSILON表示相邻浮点数之间的差。对于小于1.0的数字,FLT_EPSILON的epsilon很快会变得太大,而如果数字足够小,则FLT_EPSILON可能会比您正在比较的数字大!
Dawson在比较浮点数和处理像这样的非常小的值时还涉及了许多其他复杂性的考虑,因此,我鼓励您阅读他的文章的其余部分。
我称之为“宽容”。
也许这不是数学上正确的术语,但是您问这个问题的事实对我而言意味着“ delta”和“ epsilon”都不是一个好变量。
以我的经验,最好使用对实际阅读代码的人有意义的标识符名称。如果完全正确的名称意味着读者需要在Wikipedia上查找它才能理解它的意思,那又有什么用呢?