[英]Scala Double epsilon calculation in a functional style
A suggested approach to calculate machine epsilon using Java is as follows, 建议的使用Java 计算机器epsilon的方法如下,
private static float calculateMachineEpsilonFloat() {
float machEps = 1.0f;
do
machEps /= 2.0f;
while ((float) (1.0 + (machEps / 2.0)) != 1.0);
return machEps;
}
How to compute epsilon for scala.Double
using Scala in an idiomatic / functional style from this suggested code? 如何为Scala计算scala.Double
从此建议的代码以惯用/功能样式使用Scala?
Is that OK? 这可以吗?
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
To get another epsilon (2^{-24}), one can use dropWhile
(and, consequently, head
) instead. 要获得另一个epsilon(2 ^ {-24}),可以使用dropWhile
(因此,是head
)代替。
You can rewrite the do-while loop with recursion: 您可以使用递归重写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)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.