2011-01-13 16 views
6

¿Cuál es la mejor manera de convertir el cociente de dos C# BigIntegers conservando la mayor precisión posible? Mi solución actual es:Obtener el cociente de dos BigIntegers como el doble

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

Supongo que esto no es óptimo.

+0

¡es probable que no! Si quieres dobles al final, creo que es la mejor manera de hacerlo. Si desea números de coma flotante de precisión arbitraria, lea mi respuesta. Todo esto se proporciona BigInteger.Log genera dobles. –

+0

Quizás pueda usar el tipo F # bignum; ellos apoyan la división directamente. – Jules

Respuesta

3

Primero lea this article. Contiene lo que quieres hacer.

Luego, resuelva la expansión de fracción continua de dividendo/divisor, y deténgase cuando alcance la precisión deseada. No necesitará la operación de división costosa completa (supongo que es O (n log^2 n) o algo así), solo necesitará división/resto entero.

Sin embargo, siempre que BigInteger.Log devuelva los dobles, la operación exp (log a/log b) funcionará muy bien, y creo que puede ser más rápido que la expansión continua de fracciones. Necesita dos conversiones para duplicar (probablemente rápido), y la precisión se conserva durante toda la operación (incluso si el divisor de registro y el dividendo de registro están muy cerca el uno del otro).

Cuestiones relacionadas