【问题标题】:Why system can not find the method BigInteger.ToDouble?为什么系统找不到 BigInteger.ToDouble 方法?
【发布时间】:2010-01-09 06:40:06
【问题描述】:

我使用的是 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”这样的转换,我该怎么办?非常感谢。

【问题讨论】:

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


    【解决方案1】:

    您编写的内容可以在 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
    

    【讨论】:

    • 感谢您的解决方案。我认为使用它直到更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多