1

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 から int」や「BigNum から double」などの変換を行いたい場合はどうすればよいですか? どうもありがとう。

4

1 に答える 1

2

作成した内容は、F#スタンドアロンCTPで機能します。

このエラーは、BigIntegerタイプがF#ライブラリから.Net4.0コアライブラリに移動されたため、VS2010で発生します。この問題が、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桁を超える分子/分母には理想的ではありません。これは、小数部自体は小さい可能性がありますが、それでも2倍オーバーフローします。

例:11 ^ 300/13 ^ 280〜= 3.26337、ただし

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