Почему система не может найти метод BigInteger.ToDouble?
-
19-09-2019 - |
Вопрос
Я использую 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