Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin使用BigDecimal与Double进行计算_Kotlin_Trigonometry_Biginteger_Bigdecimal - Fatal编程技术网

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相比