我想在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.
答案 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.