FPGA/CPLD ホーム コラム 新人エンジニアの赤面ブログ ビットで表す数字の世界〜浮動小数点編〜

ビットで表す数字の世界〜浮動小数点編〜



こんにちは、ダックです。


前回符号付きの数の表し方を紹介しました。今回は浮動小数点についてです。

浮動小数点とは、小数点の位置を固定せずに表現された数です。非常に大きな数から小さな数まで表すことができます。

浮動小数点は多くの表し方がありますが、ここでは IEEE754 という方式に準拠した 32 ビット単精度浮動小数点数について扱います。この記事内で単に浮動小数点と記載した場合はこれを指します。


浮動小数点の構造


小数の位置を固定せずに表現するため、表し方は 10 進数の指数の表現のようになります。

以下のように表します。




同じようにこの「符号」、「仮数」、「指数」ビットで表現します。浮動小数点では 32 ビットを以下のように 3 つに分割します。



では、この図に数字を入れながら、それぞれがどのように表されるかを見ていきましょう。

例として、−10.25 をビットで表現してみます。


符号部の表し方


これは簡単ですね、正ならば 0 。負ならば 1 となります。

−10.25 は負の数なので符号部には 1 が入ります。




さて、ここからが浮動小数点の難しいところです。


仮数部の表し方


仮数部は実際の数字を表す部分になります。 2 進数の場合、整数では桁が上がるにつれ 2 の乗数を表していましたが、 小数では桁が下がるにつれ 0.5 の乗数 ( 2 のマイナス乗) を表します。




2 のマイナス乗ずつ加算していくので、ぴったり表せないこともあります。その場合は近い値で近似してあらわすことになります。

−10.25 の場合を見てみましょう。まずは小数点以下の 0.25 の部分はどう表現するのでしょうか?



仮数部はこの小数部分と整数部分を合わせた数になります。整数部分は 10 なので簡単に 2 進数に変換できますね。これらを合わせた変換の方法は以下の図のようになります。




整数部分と小数部分をそれぞれビットに変換し、それを合わせます。その後、整数部分が “1” で一桁になるように小数点を移動します。

そうするとビットとしては整数部分が常に 1 になります。そのため、最初の 1 を除いた 0100100… が仮数部の数字となります。残りの桁には 0 が入ります。




一番ビット数の多いところが埋まると、ついにゴールが見えてきましたね。ここまで来ると後少しです。


指数部の求め方


指数部は 10 進数の時と同じく、動かした小数点の数を表します。仮数部を求めるときに動かしたのが 3 桁なので指数部は 3 となります。

そこで指数部を 0000 0011 としたいところですが、そうは問屋が卸してくれません。この指数部はオフセットバイナリ形式で数を表します。バイアス値 127 となります。

そのため、以下の図のようにバイアス値 127 を足して 1000 0010 が指数部となります。






これで −10.25 を浮動小数点で表すことができました。

補足ですが、仮数部の説明で最上位を 1 にするといいました。しかし、一つだけ例外があります。それは 0 の時です。そのため例外的に 0 の時は浮動小数点でもすべてのビットが 0 になります。


覚えておきたい+α


今回の内容で、正の数・負の数・小数・指数も表すことができました。ただ、浮動小数点を使った演算は、各数値の小数点位置を合わせたり、オーバーフローをチェックしたりと複雑です。そのため専用の演算処理装置を組み込むことが多いです。

そして、アルテラの FPGA ではデジタル演算処理 ( DSP ) ブロックが組み込まれており、浮動小数点演算を実施することが可能です。また最新の SoC デバイス ( Arria V SoC、Cyclone V SoC ) や次世代の FPGA では浮動小数点演算がハードウェア実装されます。




学習に役立つ!今回の関連情報

アルティマ技術データベース

FPGA/CPLD 関連 技術ノウハウデータベース 「アルティマ技術データベース」では、FPGA/CPLD 関連のユーザマニュアル、

FAQ、トラブルシューティング等、設計に役立つ情報が満載です!私達も問題解決に使用しています。タイミング解析に関する資料も豊富にあります。

この機会にぜひご覧ください。



このエントリーをはてなブックマークに追加