我目前需要epsilon类型double
(首选java库中的常量而不是自己的实现/定义)
据我所知,Double
有MIN_VALUE
和MAX_VALUE
为静态成员。
为什么没有EPSILON
?
epsilon<double>
会是什么?
std::numeric_limits< double >::epsilon()
是否有任何差异?
Epsilon:1和大于1的最小值之间的差异,可以表示数据类型。
答案 0 :(得分:17)
我认为你的意思是价值错误意义上的epsilon。 I.e this。
如果是这样,那么在Java中它被称为ULP(最后一个单位)。您可以使用java.lang.Math
包和Math.ulp()
方法找到它。请参阅javadocs here。
该值不会作为静态成员存储,因为它会因您所关注的双倍而有所不同。
编辑:根据OP在问题中对epsilon的定义,值为1.0的双倍的ULP是2.220446049250313E-16,表示为double。 (即Math.ulp(1.0)
的返回值。)
答案 1 :(得分:2)
不使用Math包:
Double.longBitsToDouble(971l << 52)
那是2 ^ -52(971 = 1023(双指数偏差) - 52,偏移52是因为尾数存储在前52位)。
它比Math.ulp(1.0)快一点;
另外,如果您需要比较双倍值,那么这篇文章非常有帮助:https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
答案 2 :(得分:2)
通过编辑问题,解释EPSILON
的含义,问题现在已经很明确了,但最好指出以下几点:
我认为原始问题是由以下事实引发的:在C中有一个常量DBL_EPSILON
,在标准头文件float.h
中定义,它捕获问题所指的内容。相同的标准头文件包含常量DBL_MIN
和DBL_MAX
的定义,它们分别与Java中的Double.MIN_VALUE
和Double.MAX_VALUE
明确对应。因此,可以自然地假设Java类似地也应该包含Double.EPSILON
之类的定义,其含义与C中的DBL_EPSILON
相同。但是,事实并非如此。更奇怪的是,C#确实包含一个定义double.EPSILON
,但它有不同的含义,即C中用常量DBL_MIN
覆盖的那个和Java中的{ {1}}。当然这种情况可能导致一些混乱,因为它使Double.MIN_VALUE
这个词含糊不清。
答案 3 :(得分:0)
double:double数据类型是双精度64位IEEE 754浮点。其值范围超出了本讨论的范围,但在Java语言规范的浮点类型,格式和值部分中指定。对于十进制值,此数据类型通常是默认选择。如上所述,此数据类型不应用于精确值,例如货币。
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
仰望IEEE 754,你会发现epsion的精确度......
http://en.wikipedia.org/wiki/IEEE_floating_point
binary64: