Cプログラミングにおける算術アンダーフローとオーバーフローの意味は何ですか?
4 に答える
オーバーフロー
http://en.wikipedia.org/wiki/Arithmetic_overflowから:
特定のレジスタまたは記憶域の場所が格納または表現できる大きさよりも大きな結果が計算によって生成される場合に発生する状態。
たとえば、次のようになります。
uint32_t x = 1UL << 31;
x *= 2; // Overflow!
以下のコメントで@Rが言及しているように、C標準は次のことを示唆していることに注意してください。
結果の符号なし整数型で表現できない結果は、結果の型で表現できる最大値よりも 1 大きい数値を法として減らされるため、符号なしオペランドを含む計算はオーバーフローすることはありません。
もちろん、これは「オーバーフロー」のかなり特異な定義です。ほとんどの人は、モジュロ削減 (つまり、ラップアラウンド) を「オーバーフロー」と呼んでいます。
アンダーフロー
http://en.wikipedia.org/wiki/Arithmetic_underflowから:
浮動小数点演算の真の結果が、ターゲット データ型で通常の浮動小数点数として表現できる最小値よりも小さい (つまり、ゼロに近い) 場合に発生する可能性があるコンピューター プログラムの状態。
たとえば、次のようになります。
float x = 1e-30;
x /= 1e20; // Underflow!
コンピュータは 0 と 1 だけを使用してデータを表現するため、表現できる値の範囲は限られています。多くのコンピューターは 32 ビットを使用して整数を格納するため、この場合に格納できる符号なし整数の最大値は 2^32 -1 = 4294967295 です。ただし、最初のビットは符号を表すために使用されるため、実際には最大値は2^31 - 1 = 2147483647.
許容範囲外の整数が格納できるよりも多くのビットを必要とする状況は、オーバーフローと呼ばれます。
同様に、実数では、指数が小さすぎて格納できないと、アンダーフローが発生します。
C で最も一般的なデータ型である int は、32 ビットのデータ型です。これは、各 int にメモリ内で 32 ビットが与えられることを意味します。もし私が変数を持っていたら
int a = 2;
実際には、メモリ内では 32 ビットの 2 進数として表されます: 0000000000000000000000000000010.
次のような2つの2進数がある場合
1000000000000000000000000000000
および
100000000000000000000000000000、
それらの合計は 1000000000000000000000000000000 となり、これは 33 ビット長です。ただし、コンピューターは 32 個の最下位ビットのみを取得し、すべて 0 です。この場合、コンピューターは合計が 32 ビットに格納できる量よりも大きいことを認識し、オーバーフロー エラーを返します。
アンダーフローは、基本的に同じことが反対方向に起こっています。C で使用される浮動小数点標準では、小数点以下 23 ビットを使用できます。数値がこのポイントを超える精度を持つ場合、それらのビットを格納することはできません。これにより、アンダーフロー エラーや精度の低下が発生します。
アンダーフローは、与えられたアルゴリズムと与えられた入力データにのみ依存するため、プログラマによる直接制御はありません。一方、オーバーフローは、各スタックに予約されたメモリ空間の量に対するプログラマの任意の選択に依存し、この選択は、オーバーフローが発生する回数に影響します