2010-12-04 11 views
1

floatのサイズは4バイトで、長さは8バイトです。
したがって、floatのサイズはlongのサイズよりも小さくなります。しかし、floatの範囲はlongより大きい。Is値の範囲はデータ型のサイズによって異なりますか?

小数点以下は同じです。

データ型

+----------+------------+----------------------+ 
    | Data Type| Size  |  Range   | 
    +----------+------------+----------------------+ 
    | long | 8 bytes |-9.22e18 .. 9.22e18 | 
    | float | 4 bytes |-3.40e38 .. 3.40e38 | 
    | decimal | 16 bytes |-7.92e28 .. 7.92e28 | 
    | double | 8 bytes |-1.80e308 .. 1.80e308 | 
    +----------+------------+----------------------+ 

例:

 decimal f = 10000000000000000000.0m;   //takes 16 bytes 
     double d = 10000000000000000000000000000.0d; //takes 8 bytes 

ので、ダブルは、より大きな値を保持し、decimal.Why未満のサイズを取ることができますか?

+0

同じ質問の文脈に近いバージョンの回答もご覧ください:http://stackoverflow.com/questions/4232590/casting-float-maxvalue-to-long-throws-exceptionおそらく最も重要なことは、このドキュメントをお読みください:http://docs.sun.com/source/806-3568/ncg_goldberg.html –

答えて

1

doubleは、10進数よりも指数部に多くのビットを費やしているためです。

0

大きい値の場合は、倍精度と浮動小数点の精度が緩んでいるためです。正確な方程式については、IEEE Standard for Floating-Point Arithmeticをご覧ください。

これを非常に単純に考えてみましょう。値を表す2桁の数値を与えた場合、その数値をいくつかの方法で表します。

通常の数字の書き方に従うだけで、範囲は00 - > 99になります。しかし、 2つの数値を科学的表記法でエンコードすることができます。範囲は0 x 10^0 - > 9 x 10^9となります。

最後に両方のエンコーディングが同じ数の可能な値を表しますが、後のエンコーディングの範囲ははるかに大きくなります。

+0

最後の文章が何を意味するのか分かりません。両方が同じ数の可能な値を表す場合、どのようにしてより大きな範囲を持つことができますか? –

+0

後者のエンコーディングには "ギャップ"が存在しますが、最初と最後の2つでそれぞれ0と9の間で100個の値をエンコードすることができます。0〜9をnx 10^0としてエンコードし、 20,30,40 ...はnx 10^1として表示されますが、このエンコーディングでは11 - > 19を表すことはできません。これはまだ少しわかりにくいですが、少しはっきりしていることを願っています。 –

0

内部的に浮動小数点数は近似値です。整数は正確な値ではありません。だから、ダブルスの範囲で得られるものは、あなたが正確に支払うものです。あなたがより多くの操作を重ねると(加算、減算、...)、精度が失われます。ほとんどの計算では、倍精度は完璧ですが、通貨計算では小数点以下を使用してください。

関連する問題