[英]Scala Double epsilon calculation in a functional style
建議的使用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;
}
如何為Scala計算scala.Double
從此建議的代碼以慣用/功能樣式使用Scala?
這可以嗎?
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
)代替。
您可以使用遞歸重寫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.