我正在寻找一种在 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
但是,当我在 while
循环中删除对 float
的转换时:
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
隐式转换为 double
。
您需要通过向所有文字添加 f
后缀来强制整个表达式使用 float
。
关于java - 机器小量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21608161/