2011-01-13 15 views
6

Qual è il modo migliore per convertire il quoziente di due C# BigInteger mantenendo il più precisione possibile? La mia soluzione attuale è:Ottenere il quoziente di due BigInteger come double

Math.Exp(BigInteger.Log(dividend) - BigInteger.Log(divisor)); 

Immagino che non sia ottimale.

+0

non è probabile! Se vuoi il doppio alla fine, penso che sia il modo migliore per andare. Se vuoi numeri in virgola mobile di precisione arbitraria, leggi la mia risposta. Tutto questo è fornito BigInteger.Log genera doppi. –

+0

Forse puoi usare il tipo bignum F #; supportano direttamente la divisione. – Jules

risposta

3

Prima lettura this article. Contiene ciò che vuoi fare.

Quindi, calcolare l'espansione della frazione continua del dividendo/divisore e fermarsi quando si raggiunge la precisione desiderata. Non ti servirà l'intera costosa operazione di divisione (suppongo che sia O (n log^2 n) o qualcosa del genere), avrai bisogno solo della divisione intera/resto.

Tuttavia, se BigInteger.Log restituisce i doppi, la cosa exp (log a/log b) funzionerà alla grande, e penso che potrebbe essere più veloce dell'espansione della frazione continua. Hai bisogno di raddoppiare due conversioni (probabilmente veloce) e l'accuratezza viene preservata durante l'operazione (anche se il divisore di registro e il dividendo del registro sono molto vicini tra loro).