factorial - How to implement Stirling's formula with BigDecimal and BigInteger in Kotlin? -


i'm trying factorial program. if input number below 250 000 use tail recursive function find factorial of number. if input number exceed value of 250 000 try use stirling's formula (enter image description here). want able work bigintegers , bigdecimals, whenever try calculate 250 102 nan (not number ... error). can please me?

here code in kotlin:

import java.io.file import java.math.bigdecimal import java.math.biginteger  tailrec fun tail_recursion_factorial(n: biginteger, factorialofn: biginteger = biginteger.valueof(2)): biginteger {     return when(n){         biginteger.zero -> biginteger.one         biginteger.one ->  biginteger.one         biginteger.valueof(2) ->  factorialofn         else -> tail_recursion_factorial(n.minus(biginteger.one), n.times(factorialofn))     } }  // calculate approximate value of n! //  using stirling's approximation:  fun stirling_factorial(n: biginteger): bigdecimal {     return bigdecimal.valueof(math.sqrt((2*n.todouble()*1.0/3.0)*math.pi))*bigdecimal.valueof(math.pow(n.todouble(),n             .todouble()))*bigdecimal.valueof(math.pow(math.e,-1.0*n.todouble())) }   fun main(args: array<string>){     print("n == ")     var n = readline()     try {         when {             biginteger(n) < biginteger.zero -> println("sorry bro! can't factorial negative number.")             biginteger(n) >= biginteger.zero -> {                 when{                     biginteger(n) <= biginteger.valueof(250000) -> {                         file("factorial.txt").writetext("\"$n! ${tail_recursion_factorial(biginteger(n))}\"")                         println("check factorial.txt in project directory!")                     }                     else -> {                         println("since number bigger 250 000\nwe're calculating using stirling's formula wich approximation of factorial.\n")                         file("factorial.txt").writetext("the aproximation of $n! is\n${stirling_factorial                         (biginteger(n))}")                         println("check factorial.txt in project directory!")                     }                 }              }         }     }catch (e: numberformatexception){         println("sorry bro! can't ...")     } } 

edit: problem solved

import ch.obermuhlner.math.big.bigdecimalmath import java.io.file import java.math.bigdecimal import java.math.mathcontext 

and ....

fun stirling_formula(n: bigdecimal) : bigdecimal {     val mathcontext = mathcontext(121)     return (bigdecimal.one + bigdecimal.one.divide(bigdecimal.valueof(12).times(n),mathcontext))             .times(bigdecimalmath.sqrt((n.times(bigdecimal.valueof(2.0))).times(bigdecimalmath.pi(mathcontext)), mathcontext))             .times(bigdecimalmath.pow(n,n,mathcontext))             .times(bigdecimalmath.pow(bigdecimalmath.e(mathcontext),-n,mathcontext)) 

all goes alexander romanov

ps: i've updated formula more accurate approximation one: enter image description here

you need proper library such large computations. take @ kotlin-big-math.

val = math.pow(250102.0, 250102.0) println(a) // >> infinity  val b = bigdecimal(a) // exception in thread "main" java.lang.numberformatexception:                       // infinite or nan 

Comments

Popular posts from this blog

angular - Ionic slides - dynamically add slides before and after -

minify - Minimizing css files -

Add a dynamic header in angular 2 http provider -