2023.01.30タイムレスな子供の教育
コンピュータにおける計算
こんにちは!タイムレスエデュケーションの日高です。昨年の記事「コンピュータとデジタルデータ」では、コンピュータがデジタルデータを2進法で表現している事について説明をしました。0と1だけで数値を表現する手法を2進法と言いますが、今回の記事では「2進法で加算と減算を行う方法」について紹介させて頂きます。また「浮動小数点数」と「コンピュータで計算を行う際に生じる誤差」についても紹介いたします。
2進法での加算
まずは、2進法で加算を行う方法について説明させて頂きます。前述の通り、コンピュータの内部では情報が0と1で表現されているので、計算のパターンは「0+0=0」、「0+1=1」、「1+0=1」、「1+1=10」の4通りとなります。私たちが普段目にする数字は10進法で表現されているので、「1+1=10」と計算される事に違和感を感じるかもしれませんが、これは2進法で計算する時は2で桁上がりをするという前提があるからです。桁上がりとは、ある桁での加算結果がその桁で表せる数を超えた時、1つ上の桁に加えられる数の事を言います。私たちが10進法で計算する場合は、10で桁上がりしていますよね。これと同じで、2進法で計算する時は2で桁上がりをするというルールになっています。
<加算の例>
例えば、2進数の「0101」と「0110」を加算するケースを考えてみましょう。まず1の位は、「1+0」なので1です。また2の位は「0+1」なので、この位も1です。4の位は「1+1」なので、桁上がりが起こって0となります。そして8の位は桁上がりがあったので1となり、加算結果は「1011」となります。
2進法での減算
次に、2進法で減算を行う方法について説明します。コンピュータで負の数を表現する場合、「-(マイナス)」の記号を使いません。そのため、「基数の補数」を用いて計算して、減算を加算で処理しています。これは補数を使って計算した方が効率が良いからなのですが、「基数」や「補数」という言葉に馴染みが無い方が多いと思いますので、以下で詳しく説明させて頂ければと思います。
<基数と補数>
基数とは、1つの桁が取り得る値の個数の事を言います。2進法で表されている数の場合は基数が2となりますし、10進法で表されている場合は10となります。
そして補数の意味ですが、「n進法で表されたある数に加算した場合に桁上がりが発生する数の内、最小の数」のことです。例えば10進法での4に6を足すと、計算結果は10となって桁が1つ上がりますよね。この場合、6は4に対する「10の補数」となります。
また、2進法で「0101」に「1011」を加算する場合も考えてみましょう。この場合は加算結果が「10000」となって桁が1つ上がります。そのため、「1011」は「2の補数」となります。この例から分かるように、元の数の各ビットを反転して0と1を入れ替えてから1を足すと、「2の補数」を求めることができます。
<減算の例>
以上の内容を踏まえて、「10-7」という計算を「2の補数」を用いて行う場合を考えます。まずは下記の図で示されているように、引く値である「7」を2進数で表して「0111」とします。
その後は、2の補数を求めるために「0111」という値の各ビットを反転させて「1000」に変換します。そしてこの値に1を加算すると、2の補数は「1001」となることが分かります。
10という値は2進法で「1010」と表されるので、これに2の補数である「1001」を加算すると計算結果は「10011」となります。そしてここでは最上位桁の1を無視しますので、10進法での計算結果の3と合致します。
浮動小数点数
私たちが日常生活で見る小数を固定小数点数と言いますが、コンピュータでは一般的に小数点を表す際、浮動小数点数が使われています。浮動小数点数とは、小数点の位置を固定せずに表した数のことです。例えば、2進法の「+10.1」という値を浮動小数点数で表す場合を考えましょう。この場合、小数点の位置を1の位と2の位の間に移動させるので、「+1.01× 21」と表現することができます。このように小数点の位置を移動させて、移動した分を指数で表すと、浮動小数点数を表現することができます。
<浮動小数点数の例>
浮動小数点数は「符号部」、「指数部」、「仮数部」の3つの要素で構成されています。そして32ビットや64ビットなど固定長のビット列にして、数値として扱います。
ここでは、浮動小数点数を32ビットで表現する場合を考えてみましょう。この場合、符号部を1桁、指数部を8桁、仮数部を23桁で表します。そして符号部が正の値の時は「0」、負の値の時は「1」で表します。例えば先ほど例に挙げた「+1.01 × 21」という値を表現する場合は、符号部が0となります。
次に指数部ですが、指数の値にバイアスと呼ばれる「127」を加算して求めます。バイアスの127を足すのは、指数の値がマイナスにならないようにするためです。そうすることで、計算時に余計なビットを消費せずに済みます。今回例に挙げた値だと指数は1なので、加算結果は128となります。これを2進数に変換すると、指数部は「10000000」であることが分かります。
最後に仮数部には「1.01」の小数部を左詰めで入れて、余った部分には0を入れます。今回のケースだと小数部は「01」なので、残りの21桁は0として表すことになります。
計算の誤差
コンピュータが扱える桁数には限りがあるので、桁数が非常に大きい数を使って計算する時などに、誤差が発生する可能性が高くなります。例えば絶対値の大きい値と小さい値で加算や減算を行う場合、絶対値の小さな値が計算結果に反映されずに誤差が生じます。この誤差を「情報落ち」と呼びます。
<情報落ちの例>
具体的な例で考えると分かりやすいので、「1.01 × 21」と「1.01 × 25」を加算するケースを考えます。この計算をする場合、まず前者の値を指数の大きい方に合わせる必要があります。今回の例だと、小数点の位置を4桁分移動するので「0.000101 × 25」となります。そうすると、加算結果は下記のようになります。
そして「1.010101× 25」という結果を得ることができますが、小数点第2位の値までしか考慮しない場合には「1.01 × 25」となり、「0.000101」の加算は無視されてしまいます。これが情報落ちによる誤差です。
<その他の誤差>
計算時に生じる誤差には、「桁落ち」や「桁あふれ」と呼ばれるものもあります。桁落ちは、値がほぼ等しい2つの数値の差を求める時に生じる誤差のことです。そして桁あふれは、演算結果の数値がコンピュータが表現できる桁の範囲の最大値や最小値を超えることによって生じる誤差のことを言います。
他にも、コンピュータが表現できる桁の範囲を超えた時に最小桁より小さい部分を四捨五入や切り上げ、切り捨てをすることで生じる「丸め誤差」、コンピュータが計算処理を途中で打ち切ることで生じる「打ち切り誤差」などがあります。そのため、これらの誤差の影響を最小限に抑えるために、コンピュータを扱う人間は誤差が発生する原因を意識して計算方法を工夫する必要があります。
まとめ
今回の記事では「2進法で加算と減算を行う方法」や「浮動小数点数」、「コンピュータで計算を行う際に生じる誤差」などについて説明させて頂きました。数学が苦手な方には難しい内容だったかもしれませんが、コンピュータの中で計算が行われる際の仕組みを少しでも理解して頂けたら嬉しく思います。次回も情報Ⅰの教科書の中で扱われている内容を取り上げる予定となっていますので、また記事の更新を楽しみにお待ち下さい。最後まで読んで頂き、ありがとうございました!
参考文献:
黒上晴夫、堀田龍也、村井純、「情報Ⅰ」、日本文教出版株式会社、2022年1月