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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top