我正在使用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”等转换,我该怎么办?非常感谢。
答案 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