我目前需要一个埃普西隆类型的double (首选是java库中的常量,而不是自己的实现/定义)
据我所见,Double有MIN_VALUE和MAX_VALUE作为静态成员。
为什么没有EPSILON
epsilon<double>是什么?
std::numeric_limits< double >::epsilon()有什么区别吗?
Epsilon:对于数据类型来说,最小值大于1的差值。
发布于 2014-08-07 11:13:21
我假设你指的是这个值上的错误。即这.
如果是这样的话,那么在Java中,它被称为ULP (最后一个单元)。您可以通过使用java.lang.Math包和Math.ulp()方法找到它。见这里的javadocs。
该值不是作为静态成员存储的,因为它将根据您所关注的double而有所不同。
编辑:根据OP对epsilon的定义,现在问题中,值为1.0的双倍的ULP为2.220446049250313E-16,表示为双倍。(即Math.ulp(1.0)的返回值。)
发布于 2017-06-27 15:58:09
通过编辑这个问题,解释EPSILON的含义,这个问题现在已经很清楚了,但最好指出以下几点:
我认为,最初的问题是由一个事实触发的,即在C中有一个常数DBL_EPSILON,它在标准头文件float.h中定义,它捕获了问题所指的内容。相同的标准头文件包含常量DBL_MIN和DBL_MAX的定义,它们显然分别对应于Double.MIN_VALUE和Double.MAX_VALUE。因此,很自然地假设,通过类推,Java还应该包含类似Double.EPSILON的定义,其含义与C中的DBL_EPSILON相同。更奇怪的是,C#确实包含一个定义double.EPSILON,但它有一个不同的含义,即在C中由常量DBL_MIN覆盖的定义和由Double.MIN_VALUE覆盖的定义。当然,这种情况可能会导致一些混淆,因为它使术语EPSILON模棱两可。
发布于 2015-07-30 10:20:17
不使用数学软件包:
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/
https://stackoverflow.com/questions/25180950
复制相似问题