浮動小数演算の原理の話

レガシーな技術です。
単なる2進数の演算から、浮動小数演算の原理を説明します。

簡単のため4ビットの2進数で説明します。

0001=1
0010=2
0011=3
0100=4

そして

0.100=0.5
0.010=0.25
0.001=0.125

次はちょっと高度ですか?

0.110=0.5+0.25=0.75

4ビット数値の乗算は

2×3=6
0010(2)×0011(3)=0110(6)

でも

0.010×0.011=0.110
(=0.5+0.25=0.75?)
0.25×0.375(0.25+0.125)=0.09375

違いますね。

実は、掛け算は4ビット×4ビット=8ビットという関係にあります。
コンピュータの命令で掛け算の結果は倍長の受け皿に返されます。

0010×0011=00000110

ということです。8ビットの受け皿で考えても結果は6です。

先ほどの

0.010×0.011=00000110

さて、2倍の受け皿では小数点をどこに入れるべきか。
規則があります。
小数点が左から一つ目(便宜上−1と表現します)にある数値の乗算結果では(−1+−1=−2)左から2つ目に小数点があると考えます。
別の見方で、右から3つ目に小数点があると考えても同じです。
乗算の結果は(3+3=6)で右から6つ目に小数点があると考えてもいいです。
そう考えると

0.010×0.011=00.000110(=0.0625+0.03125=0.09375)

きちんと浮動小数計算結果に合いました。
またまた?たまたまでしょ?
そんな声が聞こえてきそうです。

それでは

00.10×0.011

と考えてみましょう。

0.5×0.375=0.1875

小数点の位置を先の例に倣って(左から−2+−1=−3、あるいは右から2+3=5)

00.10×0.011=000.00110=(0.125+0.06125=0.1875)

どうでしょう
整数の乗算で浮動小数点の乗算結果を得られることが理解できたでしょうか。

疑い深い人は、小数点の位置に関する考え方を使って、いろいろ試してみてください。

※余談ですが、初期のマイクロプロセッサの世界では、浮動小数点演算装置は別のCPU(8087ってやつです)が担っていました。演算を切り替えるための割り込み時間も必要でした。