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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top