Question

J'utilise F # Interactive, et j'ai ajouté la référence de FSharp.PowerPack.dll.

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)' à Microsoft.FSharp.Math.BigNum.ToDouble (BigNum n)"

Que puis-je faire si je veux faire de telles conversions comme « BigNum int » et « BigNum doubler »? Merci beaucoup.

Était-ce utile?

La solution

Qu'est-ce que vous avez écrit fonctionnera dans le F # autonome CTP.

Cette erreur se produit dans VS2010, parce que le type BigInteger a été déplacé de la bibliothèque F # à la bibliothèque de base .Net4.0. Je ne sais pas si cette question a quelque chose à voir avec le fait à la fois le F # CTP et la bêta VS2010 installé.

En attendant 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 cela est assez dangereux: il y débordent 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, qui encore déborder un double, tandis que la fraction elle-même pourrait être faible.

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

> numToDouble (pown 11N 300 / pown 13N 280);;
val it : float = nan
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top