Por sistema não pode encontrar o método BigInteger.ToDouble?
-
19-09-2019 - |
Pergunta
Eu estou usando F # Interactive, e eu adicionei a referência do FSharp.PowerPack.dll.
Quando tento converter bignum para funcionar como o código a seguir,
let n = 2N
let d = double n
erro sai que
"System.MissingMethodException: Método não encontrado:. 'Double System.Numerics.BigInteger.ToDouble (System.Numerics.BigInteger)' no Microsoft.FSharp.Math.BigNum.ToDouble (bignum n)"
O que posso fazer se eu quiser fazer tais conversões como "bignum para int" e "bignum a dupla"? Muito obrigado.
Solução
O que você escreveu vai trabalhar na F # autônomo CTP.
Este erro ocorre no VS2010, porque o tipo BigInteger foi movida a partir do # biblioteca de F para a biblioteca núcleo .Net4.0. Eu não tenho certeza se este problema tem algo a ver com ter tanto o F # CTP e do VS2010 beta instalado.
Até que uma solução melhor vem junto, você poderia rolar sua própria conversão como este:
let numToDouble (n:bignum) = double n.Numerator / double n.Denominator
Para converter um bignum para um inteiro você poderia então pensar em algo como isto:
let numToInt (n:bignum) = int n.Numerator / int n.Denominator
Mas isso é bastante perigoso: que vai transbordar com bastante facilidade. A versão melhor de numToInt seria converter para um duplo primeiro e depois converter para int:
let numToInt = int << numToDouble
Ainda, ambas as conversões não são ideais para numeradores / denominadores de mais de 308 dígitos, o que será ainda transbordamento uma dupla, enquanto que a própria fracção pode ser pequena.
ex: 11 ^ 300/13 ^ 280 ~ = 3,26337, mas
> numToDouble (pown 11N 300 / pown 13N 280);;
val it : float = nan