2010-01-09 5 views
1

J'utilise F # Interactive, et j'ai ajouté la référence de FSharp.PowerPack.dll.Pourquoi le système ne peut pas trouver la méthode BigInteger.ToDouble?

Lorsque je tente de convertir BigNum doubler comme le code suivant,

let n = 2N 
let d = double n 

erreur est que

« System.MissingMethodException: Méthode non trouvée: « Double System.Numerics.BigInteger.ToDouble (System.Numerics.BigInteger) 'sur Microsoft.FSharp.Math.BigNum.ToDouble (BigNum n) "

Que puis-je faire si je veux faire de telles conversions comme" BigNum to int "et" BigNum to double "? Merci beaucoup.

Répondre

2

Ce que vous avez écrit fonctionnera dans le CTP autonome F #.

Cette erreur se produit dans VS2010, car le type BigInteger a été déplacé de la bibliothèque F # vers la bibliothèque principale .Net4.0. Je ne suis pas sûr si ce problème a quelque chose à voir avec l'installation du FTP CTP et du VS2010.

jusqu'à ce qu'une meilleure solution arrive, vous pouvez rouler votre propre conversion comme ceci:

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

Pour convertir un bignum à un nombre entier alors vous pourriez penser à quelque chose comme ceci:

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

Mais c'est plutôt dangereux: ça déborde assez facilement. Une meilleure version de numToInt serait de convertir en double d'abord, puis convertir en int:

let numToInt = int << numToDouble

Pourtant, les deux conversions ne sont pas idéales pour numérateurs/dénominateurs de plus de 308 chiffres, ce qui sera toujours trop-plein un double, tandis que la fraction elle-même pourrait être petite.

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

> numToDouble (pown 11N 300/pown 13N 280);; 
val it : float = nan 
+0

Merci pour votre solution. Je pense l'utiliser jusqu'à un meilleur. –

Questions connexes