数字生成不好的价值

时间:2015-02-16 11:45:23

标签: algorithm scala math

我想在Scala中实现伯努利数字生成。我选择this algorithm。我写了以下代码:

def bernoulli(n: Int) = {

val a: Array[Fraction] = Array.fill(n + 1) {
  new Fraction()
}

for (m <- 0 to n) {

  a(m) = new Fraction(1, m + 1, 1 / (m + 1F))

  for (j <- m to 1 by -1) {

    val vc = a(j - 1)
    vc.value= j * (vc.value - a(j).value)
  }

}
a.head


 }

  class Fraction(var numerator: Int = 0, var denominator: Int = 0, var value: Float = 0)

但是当我打印bernoulli(5)时,它不是0.

1 个答案:

答案 0 :(得分:1)

您正在使用的代码似乎工作正常。你没有得到0的原因是浮点错误。如果您想要更准确的结果,可以使用BigDecimal而不是浮点数。

要使用BigDecimal,请使用a(m) = new Fraction(1, m + 1, 1 / BigDecimal(m + 1))并使用BigDecimal作为类。

通过使用BigDecimal,您将获得

    bernoulli(5).value  //> res0: BigDecimal = -1.00E-32

接近于0.