calculate machine epsilon使用Java的建议方法如下,
private static float calculateMachineEpsilonFloat() {
float machEps = 1.0f;
do
machEps /= 2.0f;
while ((float) (1.0 + (machEps / 2.0)) != 1.0);
return machEps;
}
如何使用此建议代码的惯用/功能样式使用Scala计算scala.Double
的epsilon?
答案 0 :(得分:3)
可以吗?
scala> val s: Stream[Float] = 1.0f #:: s.map(f => f / 2.0f)
s: Stream[Float] = Stream(1.0, ?)
scala> val eps = s.takeWhile(e => e + 1.0f != 1.0f).last
eps: Float = 1.1920929E-7
要获得另一个epsilon(2 ^ { - 24}),可以使用dropWhile
(因此,head
)。
答案 1 :(得分:2)
您可以使用递归重写do-while循环:
import scala.annotation.tailrec
def calculateMachineEpsilonFloat = {
@tailrec
def calc(machEps: Float): Float = {
if ((1.0 + (machEps / 2.0)).toFloat != 1.0)
calc(machEps / 2f)
else
machEps
}
calc(1f)
}