簡體   English   中英

功能風格的Scala Double epsilon計算

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM