21

タイプはどのようにdecimal実装されていますか?

アップデート

  • 128 ビットの値型 (16 バイト) です。
  • 1符号ビット
  • 仮数部 96 ビット (12 バイト)
  • 指数は8ビット
  • 残りのビット (23 個!) を 0 に設定

ありがとう!私は、独自の暗黙のスケールで64ビットの長さを使用することに固執します。

4

6 に答える 6

10

ウィキペディアの10 進浮動小数点の記事と、 に関するこの記事への特定のリンクSystem.Decimal

厳密には 102 だけが必要ですが、10 進数は 128 ビットで格納されます。小数を、仮数を表す 3 つの 32 ビット整数と、符号と指数を表す 1 つの整数と考えると便利です。最後の整数の最上位ビットは符号ビット (通常の方法で、ビットは負の数に対して設定 (1) されます) であり、ビット 16 ~ 23 (上位 16 ビット ワードの下位ビット) には指数が含まれます。他のビットはすべてクリア (0) にする必要があります。この表現は、4 つの int の配列を返す decimal.GetBits(decimal) によって与えられるものです。

于 2010-07-20T20:40:00.850 に答える
2

C# 言語仕様から:

このdecimal型は、金融および通貨の計算に適した 128 ビットのデータ型です。
このdecimal型は、1.0 × 10 −28から約 7.9 × 10 28の範囲の値を、28 ~ 29 桁の有効数字で表すことができます。

type の値の有限集合はdecimal(–1) s × c × 10 - eの形式です。ここで、符号sは 0 または 1、係数cは 0 ≤ c < 2 96で与えられ、スケールeは次のとおりです。 0 ≤ e ≤ 28となります。
このdecimal型は、符号付きゼロ、無限大、または NaN をサポートしていません。Adecimalは、10 のべき乗でスケーリングされた 96 ビット整数として表されます。絶対値が 1.0m 未満の小数の場合、値は小数点以下 28まで正確ですが、それ以上ではありません。

絶対値が 1.0m 以上の 10 進数の場合、値は正確に 28 桁または 29 桁です。floatおよびデータ型とは対照的に、double0.1 などの 10 進数の小数は、10 進数表現で正確に表すことができます。floatおよび表現ではdouble、このような数値はしばしば無限小数であり、これらの表現は丸め誤差を起こしやすくなります。

二項演算子のオペランドの 1 つが 型の場合、もう 1 つのオペランドはdecimal整数型または型でなければなりませんdecimal。整数型オペランドが存在する場合はdecimal、演算が実行される前に変換されます。

型の値に対する操作の結果はdecimal、正確な結果を計算し (各演算子で定義されているようにスケールを保持)、表現に合わせて丸めた結果となります。結果は最も近い表現可能な値に丸められ、結果が 2 つの表現可能な値に等しく近い場合は、最下位桁位置が偶数である値に丸められます (これは「バンカーの丸め」として知られています)。ゼロの結果には、常に符号 0 と位取り 0 があります。

10 進算術演算で生成される値が絶対値で5 × 10 -29以下の場合、演算の結果はゼロになります。10 進算術演算の結果がdecimalフォーマットに対して大きすぎる場合、 aSystem.OverflowExceptionがスローされます。

このdecimal型は、浮動小数点型よりも精度が高くなりますが、範囲が狭くなります。したがって、浮動小数点型decimalから への変換ではオーバーフロー例外が発生する可能性があり、 から浮動小数点型への変換decimalでは精度が失われる可能性があります。これらの理由により、浮動小数点型 と の間に暗黙的な変換は存在decimalせず、明示的なキャストがなければ、同じ式で浮動小数点とdecimalオペランドを混在させることはできません。

于 2010-07-20T20:41:21.267 に答える
1

http://msdn.microsoft.com/en-us/library/system.decimal(VS.80).aspxの MSDN の 10 進数構造ページで説明されているように:

Decimal 値のバイナリ表現は、1 ビットの符号、96 ビットの整数、および 96 ビットの整数を除算し、小数部分を指定するために使用されるスケーリング係数で構成されます。倍率は暗黙的に 10 を 0 ~ 28 の範囲の指数で累乗したものです。したがって、10 進値のバイナリ表現は ((-296 ~ 296) / 10(0 ~ 28)) の形式になります。 -296-1 は MinValue に等しく、296-1 は MaxValue に等しくなります。

スケーリング係数は、10 進数の末尾のゼロも保持します。末尾のゼロは、算術演算または比較演算の 10 進数の値には影響しません。ただし、適切な書式文字列が適用されている場合は、ToString メソッドによって末尾のゼロを明らかにすることができます。

于 2010-07-20T20:39:36.513 に答える
0

J.Richter による「C# 経由の CLR」第 3 版から:

丸め誤差が許容されない財務計算に一般的に使用される 128 ビットの高精度浮動小数点値。128 ビットのうち、1 ビットは値の符号を表し、96 ビットは値自体を表し、8 ビットは 96 ビット値を除算するための 10 の累乗を表します (0 から 28 のいずれか)。残りのビットは未使用です。

于 2010-07-20T20:39:18.997 に答える
0

decimal キーワードは、128 ビットのデータ型を示します。

ソース

Decimal 値のバイナリ表現は、1 ビットの符号、96 ビットの整数、および 96 ビットの整数を除算し、小数部分を指定するために使用されるスケーリング係数で構成されます。倍率は暗黙的に 10 を 0 ~ 28 の範囲の指数で累乗したものです。したがって、10 進値のバイナリ表現は ((-296 ~ 296) / 10(0 ~ 28)) の形式になります。 -296-1 は MinValue に等しく、296-1 は MaxValue に等しくなります。

ソース

于 2010-07-20T20:39:47.823 に答える
0

decimal 型は浮動小数点数の別の形式ですが、float や double とは異なり、基数は 10 です。

簡単な説明はこちらhttp://csharpindepth.com/Articles/General/Decimal.aspx

于 2010-07-20T20:49:40.670 に答える