キャリーのチェック
Carry into/out of the sign bit
コンピュータでは数値は有限の桁数で表されているため、正の整数値の計算結果が符号ビットに影響を与える(carry into the sign bit)あるいは符号ビットが消える(carry out of the sign bit)ことがある(J. F. Monahan, “Numerical methods of statistics”, 2010)。このことを確認するC++プログラムを以下のように作成してみた。
#include
<iostream>
using
namespace std;
int
main(){
short
int i = 1;
do{
i *= 2;
cout << i << endl;
}while(i != 0);
short
int j = 0x7fff;
cout << "j(0x7fff) = " << j << endl;
j++;
cout << "j++ = " << j << endl;
short
int k = 0x8000;
cout << "k(0x80000) = " << k <<
endl;
k *=
2;
cout << "k*2 = " << k << endl;
return
0;
}
上のプログラムをLinux(CentOS 5.5)で実行したときの端末画面の出力は以下のようになった。
[yasuharu@localhost CheckCarry]$
g++ -o checkCarry checkCarry.cpp
[yasuharu@localhost CheckCarry]$
./checkCarry
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
-32768
0
j(0x7fff)
= 32767
j++ =
-32768
k(0x80000)
= -32768
k*2 =
0
[yasuharu@localhost CheckCarry]$
上の出力において
「j++ = -32768」
がcarry into the sign bitを表すものであり、
「k*2 = 0」
がcarry out of the sign bitを表すものである。
上のプログラムのファイルcheckCarry.cppは、ファイル名checkCarry.cppをマウスの右ボタンでクリックしてダウンロードできる。