1

我正在使用 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 to int”和“BigNum to double”这样的转换,我该怎么办?非常感谢。

4

1 回答 1

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 版本是先转换为双精度然后再转换为 int:

let numToInt = int << numToDouble

尽管如此,对于超过 308 位的分子/分母来说,这两种转换都不是理想的,这仍然会溢出双精度,而分数本身可能很小。

例如:11^300 / 13^280 ~= 3.26337,但是

> numToDouble (pown 11N 300 / pown 13N 280);;
val it : float = nan
于 2010-01-09T11:18:47.290 回答