Kotlin使用BigDecimal与Double进行计算
我有两个功能。我们使用Kotlin使用BigDecimal与Double进行计算,kotlin,trigonometry,biginteger,bigdecimal,Kotlin,Trigonometry,Biginteger,Bigdecimal,我有两个功能。我们使用biginger和BigDecimal。我想用泰勒级数计算sin(z): 这是我的密码: fun sinus(z: BigDecimal, upperBound: Int = 100): BigDecimal = calcSin(z, upperBound) fun cosinus(z: BigDecimal, upperBound: Int = 100): BigDecimal = calcSin(z, upperBound, false) fun calcSin(
biginger
和BigDecimal
。我想用泰勒级数计算sin(z):
这是我的密码:
fun sinus(z: BigDecimal, upperBound: Int = 100): BigDecimal = calcSin(z, upperBound)
fun cosinus(z: BigDecimal, upperBound: Int = 100): BigDecimal = calcSin(z, upperBound, false)
fun calcSin(z: BigDecimal, upperBound: Int = 100, isSin: Boolean = true): BigDecimal {
var erg: BigDecimal = BigDecimal.ZERO
for (n in 0..upperBound) {
// val zaehler = (-1.0).pow(n).toBigDecimal() * z.pow(2 * n + (if (isSin) 1 else 0))
// val nenner = fac(2 * n + (if (isSin) 1 else 0)).toBigDecimal()
val zaehler = (-1.0).pow(n).toBigDecimal() * z.pow(2 * n + 1)
val nenner = fac(2 * n + 1).toBigDecimal()
erg += (zaehler / nenner)
}
return erg
}
fun calcSin(z: Double, upperBound: Int = 100): Double {
var res = 0.0
for (n in 0..upperBound) {
val zaehler = (-1.0).pow(n) * z.pow(2 * n + 1)
val nenner = fac(2 * n + 1, true)
res += (zaehler / nenner)
}
return res
}
fun fac(n: Int): BigInteger = if (n == 0 || n == 1) BigInteger.ONE else n.toBigInteger() * fac(n - 1)
fun fac(n: Int, dummy: Boolean): Double = if (n == 0 || n == 1) 1.0 else n.toDouble() * fac(n - 1, dummy)
根据谷歌的说法,Sin(1)是
0.8414709848
但是,以下内容的输出是:
println("Sinus 1: ${sinus(1.0.toBigDecimal())}")
println("Sinus 1: ${sinus(1.0.toBigDecimal()).toDouble()}")
println("Sinus 1: ${sinus(1.0.toBigDecimal(), 1000)}")
println("Sinus 1: ${calcSin(1.0)}")
输出:
Sinus 1: 0.8414373208078281027995610599000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Sinus 1: 0.8414373208078281
Sinus 1: 0.8414373208078281027995610599000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Sinus 1: 0.8414709848078965
我错过了什么?为什么Double变量给出正确的值,而BigDecimal变量没有给出正确的值?即使有1000次迭代。
注释掉的代码也用于计算Cos,但想先解决这个问题,所以我在
BigDecimal
变量中使两个函数看起来相同,尝试用erg+=(zaehler/nenner)
替换erg+=(zaehler.divide(nenner,20,RoundingMode.HALF\u偶数))
我怀疑缩放除法结果的默认值(如本文所述)不是您想要的
顺便说一句-我假设性能不是练习的一部分,否则您的阶乘实现是一个低挂果实。在
BigDecimal
变体中,尝试用erg+=(zaehler/nenner)
替换erg+=(zaehler.divide(nenner,20,RoundingMode.HALF_偶数))
我怀疑缩放除法结果的默认值(如本文所述)不是您想要的
顺便说一句-我假设性能不是练习的一部分,否则您的阶乘实现是一个很容易实现的结果。我知道它的实现并不完美,甚至是罪恶。在性能方面,我有一个更好的实现,但我刚刚开始学习Kotlin,这只是练习语法的例子,与JavaI相比,我知道它的实现并不完美,甚至是Sin。在性能方面,我有一个更好的实现,但我刚刚开始学习Kotlin,这只是练习语法的例子,与Java相比