Вопрос

Я использую 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 в double»?Большое спасибо.

Это было полезно?

Решение

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

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

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

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

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top