我正在寻找一种简单的方法来近似Java中的Machine Epsilon:
float machEps = 1.0f;
do
machEps /= 2.0f;
while ((float) (1.0 + (machEps / 2.0)) != 1.0);
System.out.println( machEps);
返回:
1.1920929E-7
但是,当我在float
循环中删除转化为while
时:
float machEps = 1.0f;
do
machEps /= 2.0f;
while ( (1.0 + (machEps / 2.0)) != 1.0);
System.out.println( machEps);
我明白了:
2.220446E-16
我不太确定这是为什么......我的 猜测 是在第二种情况下,Java尝试从{{{}}扩展machEps
{1}}到float
。但是,我不确定这是否是一个准确的陈述,或者是否还有其他原因可以得到两个不同的答案。
答案 0 :(得分:6)
1.0
和2.0
是double
s。
double
和float
之间的算术会隐式将float
转换为doubles
。
您需要通过向所有文字添加float
后缀来强制整个表达式使用f
。
答案 1 :(得分:3)
您在寻找java.lang.Math.ulp
吗?
返回参数的ulp大小。双值的ulp是此浮点值与接下来幅度较大的double值之间的正距离。
答案 2 :(得分:1)
使用Math.nextUp(1.0f),您可以轻松找到严格大于1.0的最小浮点数。