2009-04-03 14 views
2
  1. ジョン・ハロップ氏は述べています:F#(および.NET)での浮動小数点精度に

    分-INTとmax-INTの間にint型の近似実数 番号の大まかに言えば、値を持ちます+ - 1/2 という一定の絶対誤差、浮動小数点型の値はほぼ一定の相対誤差を持ち、 はわずかな割合です。

    ここで、それはどういう意味ですか? Int型が不正ですか?

  2. なぜC#は(1 - 0.9)が0.1を返しますが、F#は0.099999999999978を返しますか? C#はより正確で科学的計算に適していますか?

  3. 科学計算にはdouble/floatの代わりに10進値を使用する必要がありますか?

答えて

6
  1. 任意の実数については、整数型または浮動小数点型のいずれかが近似を提供するだけです。積分近似は、一方向または他の方向で0.5を超えることは決してありません(実数がその整数型の範囲内に収まると仮定して)。浮動小数点近似は、わずかなパーセンテージ以上になることはありません(実数がその浮動小数点型でサポートされている値の範囲内にあると仮定して)。これは、小さな値の場合、浮動小数点型はより近い近似を提供することを意味します(例えば、浮動小数点のPIへの近似をint近似3よりもずっと正確に格納することができます)。しかし、非常に大きな値の場合、積分型の近似は実際には浮動小数点型よりも優れています(例えば9223372036854775806.7の値を考えてください。これは9223372036854775807として表されているときには0.3だけオフですが、9223372036854780000.000000として表されます)。フロート)。

  2. これは、値をどのように印刷するかの単なる物です。分母が2の累乗ではないため、浮動小数点値として正確に表現することはできません。ちょうど1/3を小数として正確に書くことはできません(あなたは0.333を得ます。 3は永遠に繰り返す)。使用する.NET言語にかかわらず、この値の内部表現は同じになりますが、値を印刷するさまざまな方法で別々に表示されることがあります。 FSIで1.0〜0.9を評価すると、結果は0.1(少なくとも私のコンピュータ上)と表示されることに注意してください。

  3. 科学計算で使用するタイプは、達成しようとしているものによって異なります。あなたの答えは、一般的にはほぼ正確になるでしょう。どの程度正確にする必要がありますか?あなたのパフォーマンス要件は何ですか?私は小数点の型は実際には固定小数点数であると考えており、非常に小さい値や非常に大きな値を含む計算には不適切な場合があります。また、F#には任意の精度の有理数(BigNum型)が含まれていることにも注意してください。

2

いいえ、F#とC#は同じダブルタイプを使用します。浮動小数点はほとんど常に不正確です。しかし、整数は正確です。

はUPDATE:

あなたは違いを見ている理由は数ではなく、実際の表現の印刷によるものです。

2

最初の点は、intを使用して、intgerの範囲内の任意の実数を表すことができ、[-0,5、0.5]で一定の最大誤差があると言います。意味あり。例えば、piは整数値3で表され、誤差は0.15より小さい。

浮動小数点数はこのプロパティを共有しません。それらの最大絶対誤差は、あなたが表現しようとしている値とは無関係ではありません。

0

3 - これは計算に依存します:フロートが良い選択であることがあります。時にはintを使うこともできます。しかし、浮動小数点数と小数精度の精度が不足している場合、タスクがあります。

INTを使用に対する理由:

> 1/2;; 
val it : int = 0 

(また、C#でダブルとしても知られる)フロート使用に対する理由:小数 BCL に対して

> (1E-10 + 1E+10) - 1E+10;; 
val it : float = 0.0 

理由:

> decimal 1E-100;; 
val it : decimal = 0M 

リストされているすべてのタイプには、それぞれの欠点があります。

+0

MSDNには、System.Double:http://msdn.microsoft.com/en-us/library/ee353546.aspx – vpolozov

関連する問題