Pregunta

Estoy usando F # interactivo, y he añadido la referencia de FSharp.PowerPack.dll.

Cuando intento para convertir bignum a doblar como el siguiente código:

let n = 2N
let d = double n

error, se descubre que

"System.MissingMethodException: Método no encontrado:. 'Double System.Numerics.BigInteger.ToDouble (System.Numerics.BigInteger)' en Microsoft.FSharp.Math.BigNum.ToDouble (bignum n)"

¿Qué puedo hacer si quiero hacer este tipo de conversiones como "bignum a int" y "bignum a doble"? Muchas gracias.

¿Fue útil?

Solución

Lo que usted ha escrito funcionará en el F # CTP independiente.

Este error se produce en VS2010, porque el tipo BigInteger se ha movido de la # biblioteca F a la biblioteca núcleo .Net4.0. No estoy seguro de si esto tiene algo que ver con tener instalados tanto el F # CTP y la versión beta de VS2010.

Hasta que una solución mejor que pase, usted podría rodar su propia conversión de esta manera:

let numToDouble (n:bignum) = double n.Numerator / double n.Denominator

Para convertir un número grande a un entero que entonces podría pensar en algo como esto:

let numToInt (n:bignum) = int n.Numerator / int n.Denominator

Pero esto es bastante peligroso: que va a desbordamiento con bastante facilidad. Una versión mejorada de numToInt sería convertir a un doble primero y luego convertir a int:

let numToInt = int << numToDouble

Aún así, ambas conversiones no son ideales para numeradores / denominadores de más de 308 dígitos, que todavía se desbordará un doble, mientras que la fracción en sí podría ser pequeña.

ex: 11 ^ 300/13 ^ 280 ~ = 3,26337, pero

> numToDouble (pown 11N 300 / pown 13N 280);;
val it : float = nan
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top