当サイトの一部ページには、アフィリエイト・アドセンス・アソシエイト・プロモーション広告を掲載しています。

Amazonのアソシエイトとして、Security Akademeiaは適格販売により収入を得ています。

広告配信等の詳細については、プライバシーポリシーページに掲載しています。

消費者庁が、2023年10月1日から施行する景品表示法の規制対象(通称:ステマ規制)にならないよう、配慮して記事を作成しています。もし問題のある表現がありましたら、問い合わせページよりご連絡ください。

参考:令和5年10月1日からステルスマーケティングは景品表示法違反となります。 | 消費者庁

Floating-point multiplication【NandGame編】

はじめに

いつもブログをご覧いただきありがとうございます。

セミリタイア・ミジンコのIPUSIRONです😀

IPUSIRONのプロフィールを見る

浮動小数点数の乗算

浮動小数点の演算では、加算や減算より乗算の方が簡単です。そこで、乗算の解説から始めます。

浮動小数点の乗算は「仮数の乗算」と「指数の加算」で実現されます。

Floating-point multiplicationレベル

Floating-point multiplicationレベルのゴールは、浮動小数点の乗算を実現する回路を組むことです。

回路の入出力は次のとおりです。

入力Aパックされていない浮動小数点数。33ビット(=1+16+16=sg分+exp分+sf分)
・sg:符号。0=正、1=負。
・exp:バイアス指数
・sf:仮数
入力Bパックされていない浮動小数点数。33ビット。
出力乗算結果の(パックされていない)浮動小数点数。
・sg:「Aのsg」と「Bのsg」の乗算結果。
・exp:「Aのexp」と「Bのexp」を加算し、その計算結果からバイアス分を引いたもの。
※AとBの両方がバイアス化されているため。加算するとバイアス1回分余分になる。
・sf:「Aのsf」と「Bのsf」を乗算し、その計算結果を補正したもの。
11ビット値を乗算すると、21ビットまたは22ビットが得られる。
出力値である浮動小数点の仮数は11ビットまたは12ビットにするため、乗算結果の下位10ビットを切り捨てる。
回路の入出力

余談ですが、仮数の計算に切り捨て処理があるため、浮動小数点演算によって精度を失われる可能性があります。

Floating-point multiplicationレベルを解く

1:出力のsgを計算する回路を組む

sgは符号であり、「正=0」「負=1」と定義されています。

符号の乗算表は次のとおりです。

AのsgBのsg出力のsg
符号の乗算表

このままではわかりにくいので、「正=0」「負=1」で置き換えます。

AのsgBのsg出力のsg
000
011
101
110

これはXORゲートの真理値表そのものです。つまり、xorコンポーネントを1つ通すだけで、出力のsgにつなげるだけです。

2:出力のexpを計算する回路を組む

出力のexpについては、入力のexp同士を加算し、バイアス分の15を引けばよいだけです。

3:出力のsfを計算する回路を組む

当該レベルのために、mulコンポーネントと22ビット用のsplitterコンポーネントが用意されてます。

mulコンポーネントは、2つの11ビット値の乗算の積を実現する、22ビット乗算器です。出力ピンの脇に小さく「22」とあることから、22ビット値を出力することがわかります。

22ビット用のsplitterコンポーネントは、22ビット値を各桁に分離する回路です。

これらのコンポーネントを活用すると、次の回路になります。

4:テストする

テストにパスすると、クリアになります。