Skip to content

Instantly share code, notes, and snippets.

@eggfly
Created August 26, 2024 12:21
Show Gist options
  • Save eggfly/f96690241dd997e41b4962a79f75111f to your computer and use it in GitHub Desktop.
Save eggfly/f96690241dd997e41b4962a79f75111f to your computer and use it in GitHub Desktop.
Interesting Pi Leibniz Algorithm in Kotlin
package com.test
import java.math.BigDecimal
import java.math.MathContext
import java.math.RoundingMode
import java.text.NumberFormat
fun divideBigDecimal(dividend: BigDecimal, divisor: BigDecimal, scale: Int): BigDecimal {
return dividend.divide(divisor, scale, RoundingMode.HALF_UP)
}
fun calculatePiLeibniz(iterations: Long, scale: Int): BigDecimal {
var pi = BigDecimal.ZERO
val one = BigDecimal.ONE
val four = BigDecimal(4)
val mc = MathContext(scale, RoundingMode.HALF_UP)
for (i in 0 until iterations) {
val denominator = BigDecimal(2 * i + 1)
val term = four.divide(denominator, mc)
if (i % 2 == 0L) {
pi = pi.add(term, mc)
} else {
pi = pi.subtract(term, mc)
}
}
println("Calculated π: $pi with $iterations iterations")
val nf = NumberFormat.getInstance();
nf.isGroupingUsed = false
nf.maximumFractionDigits = scale
nf.maximumFractionDigits = scale
println("* real π - π: ${nf.format(piReal - pi)} with $iterations iterations")
return pi
}
val piReal =
BigDecimal("3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679")
fun main() {
val scale = 200 // 小数位数
// val iterations = // 迭代次数
println("-- Precise π: $piReal")
calculatePiLeibniz(100000, scale)
calculatePiLeibniz(1000000, scale)
calculatePiLeibniz(10000000, scale)
calculatePiLeibniz(100000000, scale)
calculatePiLeibniz(1000000000, scale)
calculatePiLeibniz(10000000000, scale)
calculatePiLeibniz(100000000000, scale)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment