Pourquoi le système ne peut pas trouver la méthode BigInteger.ToDouble?
-
19-09-2019 - |
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.
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