为什么系统找不到BigInteger.ToDouble方法?

时间:2010-01-09 06:40:07

标签: .net-4.0 f# type-conversion bignum

我正在使用F#Interactive,我添加了FSharp.PowerPack.dll的引用。

当我尝试将BigNum转换为double时,如下面的代码,

let n = 2N
let d = double n

出现错误

“System.MissingMethodException:找不到方法:'Double System.Numerics.BigInteger.ToDouble(System.Numerics.BigInteger)'。at Microsoft.FSharp.Math.BigNum.ToDouble(BigNum n)”

如果我想进行“BigNum to int”和“BigNum to double”等转换,我该怎么办?非常感谢。

1 个答案:

答案 0 :(得分:2)

您编写的内容适用于F#独立CTP。

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位数的分子/分母来说,两次转换都不理想,这仍然会溢出一倍,而分数本身可能很小。

ex:11 ^ 300/13 ^ 280~ = 3.26337,但

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