2010-01-09 3 views
1

Я использую F # Interactive, и я добавил ссылку на FSharp.PowerPack.dll.Почему система не может найти метод BigInteger.ToDouble?

Когда я пытаюсь преобразовать BigNum в два раза, как следующий код,

let n = 2N 
let d = double n 

ошибка выходит, что

«System.MissingMethodException: Метод не найден:«Двойной System.Numerics.BigInteger.ToDouble (System.Numerics.BigInteger) '. В Microsoft.FSharp.Math.BigNum.ToDouble (BigNum n) "

Что делать, если я хочу сделать такие преобразования, как« BigNum to int »и« BigNum, чтобы удвоить «? Огромное спасибо.

ответ

2

То, что вы написали, будет работать в автономном CTP F #.

Эта ошибка возникает в VS2010, поскольку тип BigInteger был перемещен из библиотеки F # в основную библиотеку .Net4.0. Я не уверен, что эта проблема имеет какое-то отношение к установке как F # CTP, так и бета-версии VS2010.

Пока лучшее решение не приходит, вы можете свернуть свое собственное преобразование, как это:

let numToDouble (n:bignum) = double n.Numerator/double n.Denominator

Чтобы преобразовать bignum в целое число вы могли бы подумать о чем-то вроде этого:

let numToInt (n:bignum) = int n.Numerator/int n.Denominator

Но это довольно опасно: он будет легко переполняться. Лучше версия numToInt будет преобразовать в двойном первый, а затем преобразовать в целое:

let numToInt = int << numToDouble

Тем не менее, оба преобразования не являются идеальными для нумераторов/знаменателей более 308 цифр, которые будут по-прежнему переполнение двойной, тогда как сама фракция может быть маленькой.

например: 11^300/13^280 ~ = 3,26337, но

> numToDouble (pown 11N 300/pown 13N 280);; 
val it : float = nan 
+0

Спасибо за ваше решение. Я думаю, что использовать его до лучшего. –

Смежные вопросы