函数式Scala双ε计算

函数式Scala双ε计算,scala,double-precision,purely-functional,epsilon,Scala,Double Precision,Purely Functional,Epsilon,建议使用Java的方法如下: private静态浮点计算器machineepsilonfloat(){ 浮动马赫数=1.0f; 做 马赫数/=2.0f; 而((浮动)(1.0+(马赫数/2.0))!=1.0); 返回马赫数; } 如何计算scala.Double的epsilon,从建议的代码中以惯用/函数的方式使用scala?可以吗 scala> val s: Stream[Float] = 1.0f #:: s.map(f => f / 2.0f) s: Stream[Float

建议使用Java的方法如下:

private静态浮点计算器machineepsilonfloat(){
浮动马赫数=1.0f;
做
马赫数/=2.0f;
而((浮动)(1.0+(马赫数/2.0))!=1.0);
返回马赫数;
}
如何计算scala.Double的epsilon,从建议的代码中以惯用/函数的方式使用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(因此,
)来代替

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)
}

您可以使用递归重写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)
}