我正在寻找一种在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
从float
扩展为double
。但是,我不确定这是否是正确的陈述,或者是否有其他原因导致我得到两个不同的答案。 最佳答案
1.0
和2.0
是double
。double
和float
之间的算术运算会将float
隐式转换为doubles
。
您需要通过将float
后缀添加到所有文字中来强制整个表达式使用f
。