数値の内部表現と誤差
このノートの問いがそのまま復習カードになり、忘れかけたころに出題されます。
0. どういうまとまりか
コンピュータは数を決まった桁数の 0 と 1(ビット)で持ちます。桁数が有限なので、
表せる数の範囲には限りがあり、表せない数は近い値で代用するしかありません。これが誤差の出どころです。
| 表し方 | 何に使うか | 限界 |
|---|---|---|
| 符号なしの整数 | 0 以上の整数 | n ビットで 0 から まで |
| 2 の補数 | 負の数を含む整数 | n ビットで から まで |
| 固定小数点 | 小数点の位置を決めておく | 範囲が狭い |
| 浮動小数点 | 符号部・指数部・仮数部に分けて持つ | 広い範囲を表せるが、仮数部の桁で誤差が出る |
分かれ目は次の 3 つ。
- n ビットで表せるのは 通り。8 ビットなら 256 通り。
- 2 の補数は「全ビットを反転して 1 を足す」。最上位ビットが 1 なら負の数。
- 10 進数の 0.1 は 2 進数では割り切れず、正確には表せない(丸め誤差が出る)。
1. ビット数と表せる範囲
根拠: 学習指導要領 情報Ⅰ-(3)-ア-(ア)
1 ビットは 0 か 1 の 2 通りです。ビットを 1 つ増やすごとに、表せる組み合わせは 2 倍になります。
8 ビットの符号なし整数で表せる範囲は?
0 から 255 まで
256 通りのうち 1 つを 0 に使うので、最大は 255。
ある数が n ビットで表せる範囲を超えてしまい、正しく表せなくなることを何というか?
桁あふれ(オーバーフロー)
8 ビットの符号なし整数で 255 に 1 を足すと、9 ビット目が入らず 0 に戻ってしまう。
2. 2 の補数
根拠: 学習指導要領 情報Ⅰ-(3)-ア-(ア)
負の数を表すには、2 の補数を使う方法が広く使われています。
2 の補数を使うと、引き算を「負の数を足す」足し算として計算でき、加算の回路だけで済みます。
| 10 進数 | 8 ビットの 2 の補数 |
|---|---|
| 127 | 01111111 |
| 1 | 00000001 |
| 0 | 00000000 |
| −1 | 11111111 |
| −128 | 10000000 |
ある 2 進数の 2 の補数は、どうやって求めるか?
全ビットの 0 と 1 を反転し、1 を足す
8 ビットの 00000011(3)なら、反転すると 11111100、1 を足すと 11111101。これが −3 を表す。
2 の補数で負の数を表すとき、正か負かはどこで見分けるか?
最上位ビット(いちばん左のビット)。0 なら 0 以上、1 なら負の数
8 ビットの 2 の補数で表せる範囲は?
−128 から 127 まで
256 通りを負の数と 0 以上の数で半分ずつ分ける。n ビットなら から 。
コンピュータが負の数に 2 の補数を使う利点は何か?
引き算を、負の数の足し算として加算回路だけで計算できる
符号を別に扱う回路がいらない。
3. 固定小数点と浮動小数点
根拠: 学習指導要領 情報Ⅰ-(3)-ア-(ア)
小数を表すには、小数点の位置を決め打ちにする固定小数点と、10 進数の「」のように
数を「符号・指数・仮数」に分けて持つ浮動小数点があります。
浮動小数点で数を表すとき、どんな 3 つの部分に分けて持つか?
符号部・指数部・仮数部
符号部は正か負か、指数部は桁の位置(2 の何乗か)、仮数部は有効数字の並びを表す。
固定小数点と比べた浮動小数点の利点は何か?
同じビット数で、とても大きい数からとても小さい数まで広い範囲を表せる
その代わり、仮数部の桁数を超える細かさは表せず、誤差が出る。
4. 誤差
根拠: 学習指導要領 情報Ⅰ-(3)-ア-(ア)
ビット数が決まっている以上、計算の結果がいつも正確とは限りません。コンピュータで起こる誤差には、次のような種類があります。
| 誤差 | どこで起こるか |
|---|---|
| 丸め誤差 | 表せる桁より下を、切り捨て・切り上げ・四捨五入したとき |
| 桁あふれ(オーバーフロー) | 結果が表せる範囲を超えたとき |
| 情報落ち | 絶対値の大きく違う数を足したり引いたりしたとき |
| 桁落ち | 値のほぼ等しい数どうしを引いたとき |
10 進数の 0.1 を 2 進数で表すと、どうなるか?
0.000110011… と 0011 が限りなく続き、有限のビットでは正確に表せない
途中で打ち切るので、コンピュータの 0.1 はわずかにずれた値になっている。
表せる桁数より下を切り捨て・切り上げ・四捨五入したことで生じる誤差を何というか?
丸め誤差
0.1 を 10 回足しても、ぴったり 1 にならないことがあるのはこのため。
絶対値のとても大きい数に、とても小さい数を足したとき、小さいほうの数が結果に反映されなくなる誤差を何というか?
情報落ち
仮数部の桁数に収まらない小さな値が、桁合わせのときに消えてしまう。
値がほぼ等しい 2 つの数を引き算したとき、有効数字の桁数が大きく減ってしまう誤差を何というか?
桁落ち
上の桁が打ち消し合い、信頼できる桁がわずかしか残らない。
練習問題
問 1 10 進数の −5 を、8 ビットの 2 の補数で表せ。
11111011
5 は 8 ビットで 00000101。全ビットを反転すると 11111010。これに 1 を足すと 11111011。
問 2 8 ビットの 2 の補数で表された 11111010 は、10 進数でいくつか。
−6
最上位ビットが 1 なので負の数。もう一度 2 の補数をとって絶対値を出す。
反転すると 00000101、1 を足すと 00000110 で、これは 10 進数の 6。したがって元の数は −6。
問 3 8 ビットの 2 の補数で、00000111(7)と 11111101(−3)を足した結果を 8 ビットで答えよ。
00000100(4)
2 つを筆算で足すと 9 桁目に 1 があふれるが、8 ビットに収まらない桁は捨てる。残った 8 ビットは 00000100 で、10 進数の 4。
7 から 3 を引く計算が、足し算だけでできている。