我正在研究一种简单的方法来近似Java中的Machine:
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我不太清楚为什么is....my 猜测是在第二种情况下,Java试图将machEps从float扩展到double。然而,我不确定这是否是一个准确的陈述,或是否有另一个原因,我得到了两个不同的答案。
发布于 2014-02-06 16:15:57
1.0和2.0是double的。
doubles和floats之间的算术将隐式地将floats转换为doubles。
您需要通过在所有文本中添加float后缀来强制整个表达式使用f。
发布于 2014-02-06 16:20:54
你在找java.lang.Math.ulp吗
返回参数的ulp的大小。一个双值的ulp是这个浮点值和第二个更大的值之间的正距离。
发布于 2014-02-06 16:19:46
使用Math.nextUp(1.0f),您可以很容易地找到严格大于1.0的最小浮点数。
https://stackoverflow.com/questions/21608161
复制相似问题