Почему система не может найти метод BigInteger.ToDouble? - PullRequest
1 голос
/ 09 января 2010

Я использую F # Interactive, и я добавил ссылку на FSharp.PowerPack.dll.

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

let n = 2N
let d = double n

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

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

Что я могу сделать, если я хочу сделать такие преобразования, как "BigNum в int" и "BigNum в удвоение"? Большое спасибо.

1 Ответ

2 голосов
/ 09 января 2010

То, что вы написали, будет работать в автономной 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 было бы сначала преобразовать в double, а затем преобразовать в int:

let numToInt = int << numToDouble

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

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

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