[英]Java double epsilon
我目前需要一个double
类型的epsilon (首选是java库中的常量而不是自己的实现/定义)
据我所知, Double
有MIN_VALUE
和MAX_VALUE
作为静态成员。
为什么没有EPSILON
?
epsilon<double>
会是什么?
与std::numeric_limits< double >::epsilon()
有什么区别吗?
Epsilon:1和大于1的最小值之间的差异,可以表示数据类型。
不使用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/
通过编辑问题,解释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
覆盖的DBL_MIN
,在Java中由Double.MIN_VALUE
覆盖。 当然这种情况可能导致一些混乱,因为它使EPSILON
这个词含糊不清。
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:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.