2012-12-18 18 views
9

C'è modo di eseguire l'esponenziazione di precisione arbitraria in Clojure? Ho provato Math/pow e la funzione expt da clojure.math.numeric-tower, ma entrambi restituiranno solo una precisione limitata. Ad esempio:Esponenziazione arbitraria di precisione in Clojure

(with-precision 100 (expt 2 1/2)) 
=> 1.4142135623730951 

Come ottengo più cifre?

+1

Quante cifre si desidera? 'sqrt (2)' non può essere espresso come numero razionale (come una frazione di due numeri finiti). Vuoi una lista pigra di cifre? –

+2

Ho provato a ottenere 100 cifre usando "con precisione", ma come potete vedere non ha fatto nulla. La risposta è: voglio specificare la precisione. La funzione expt accetta argomenti bigdec ma restituisce solo risultati di precisione limitati. –

risposta

3

Apfloat for Java fornisce aritmetica di precisione arbitraria veloce. È possibile utilizzarlo facilmente aggiungendo le seguenti informazioni di dipendenza al file project.clj, se il progetto viene fornito con Leiningen.

[org.apfloat/apfloat "1.6.3"] 

È possibile eseguire l'esponenziazione di precisione arbitraria in Clojure utilizzando Apfloat. Ad esempio:

user> (import '(org.apfloat Apfloat ApfloatMath)) 
org.apfloat.ApfloatMath 

user> (-> (Apfloat. 2M 100) (ApfloatMath/pow (Apfloat. 0.5M 100))) 
1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727 
2

math/expt è probabile che non la funzione che si sta cercando in quanto restituisce una doppia invece di un BigDecimal in questo contesto, e quindi ignora la tua with-precision dichiarazione:

Restituisce un numero esatto se la base è un esatto numero e la potenza è un numero intero, altrimenti restituisce un doppio.

user> (type (with-precision 100 (math/expt 2M 1/2))) 
java.lang.Double 

la risposta a this question sembra coprire come ottenere precisione arbitraria di BigDecimal elevamento a potenza. BigDecimal sembra non fornire questo "out of the box"

+1

In tal caso, quale * è * la funzione che l'OP sta cercando? –

Problemi correlati