Perché il sistema non riesce a trovare il metodo BigInteger.ToDouble?
-
19-09-2019 - |
Domanda
Sto usando F # Interactive, e ho aggiunto il riferimento di FSharp.PowerPack.dll.
Quando tento di convertire bignum per raddoppiare come il seguente codice,
let n = 2N
let d = double n
errore viene fuori che
"System.MissingMethodException: metodo non trovato:. 'Double System.Numerics.BigInteger.ToDouble (System.Numerics.BigInteger)' a Microsoft.FSharp.Math.BigNum.ToDouble (bignum n)"
Che cosa posso fare se voglio fare queste conversioni come "bignum a int" e "bignum a raddoppiare"? Grazie mille.
Soluzione
Quello che hai scritto lavorerà in F # standalone CTP.
Questo errore si verifica in VS2010, perché il tipo di BigInteger è stato spostato dalla # libreria F alla libreria di base .Net4.0. Non sono sicuro se questo problema ha a che fare con avere sia il F # CTP e beta VS2010 installato.
Fino a quando una soluzione migliore viene avanti, si potrebbe rotolare il proprio di conversione in questo modo:
let numToDouble (n:bignum) = double n.Numerator / double n.Denominator
Per convertire un bignum in un intero si potrebbe quindi pensare a qualcosa di simile a questo:
let numToInt (n:bignum) = int n.Numerator / int n.Denominator
Ma questo è piuttosto pericoloso: che sarà traboccare abbastanza facilmente. Una migliore versione di numToInt sarebbe quello di convertire in doppio prima e poi convertire in int:
let numToInt = int << numToDouble
Ancora, entrambe le conversioni non sono ideali per numeratori / denominatori di oltre 308 posizioni, che ancora dimensioni troppo un letto, mentre la frazione stessa potrebbe essere piccola.
es: 11 ^ 300/13 ^ 280 ~ = 3,26,337 mila, ma
> numToDouble (pown 11N 300 / pown 13N 280);;
val it : float = nan