浮動小数点数
浮動小数点数の最新ニュースをまとめて検索!
浮動小数点数(ふどうしょうすうてんすう)は、コンピュータにおける実数の近似値の表現方式。
固定小数点数と比較するとさまざまな誤差が発生しやすいが、大きな値や、逆に小さな値を表現するのに向いている。そのため、誤差の概念がはっきりしている分野や極端な数を扱う分野(科学計算など)で多く用いられている。また、プログラミング言語のほとんどが対応しているということもあり、小数の表現方法としては最も普及している。
固定小数点数の演算と比べると演算速度が遅いため、FPU(浮動小数点数プロセッサ)と呼ばれる、浮動小数点数の演算を高速化するための専用の装置を別途搭載している場合が多い(現在では、CPUに内蔵していることも多い)。
目次 |
[編集] 浮動小数点数の構造
値の表現方法は、たとえば国際単位系 (SI) で、キロは103、センチは10-2と表現するのに似ている。ただし、浮動小数点数では次の3つのデータで数値を表現する。
- 符号部(1ビット)
- 仮数部(符号なし整数)
- 指数部(符号付き整数)
浮動小数点数では、数値の絶対値は(仮数部)×(基数)(指数部)となる。たとえば、0.5を浮動小数点数で表すと、基数が10の場合は0.05×101(0.05e+1)、基数が2の場合は0.25×21となる。
仮数部に割り当てられたビット数をnとすると、2進数での有効桁数はn+1となる。これは、最上位の桁は必ず1になり、表現する必要がないためである。なお、0を表す場合は符号部、仮数部、指数部のすべてのビットを0にする。
[編集] 浮動小数点数の表現方法
浮動小数点数の表現方法はいくつかの種類がある。
- IEEE方式(IEEE 754。最も広く採用されている標準規格。)
- IBM方式(エクセス64。IBMのメインフレームで使われている仮数部を16進数で表現するもの)
それぞれ32ビット表現(単精度)と64ビット表現(倍精度)とがある。 また、x86互換CPUは内部的に80ビット表現(拡張倍精度)へと変換を行い演算を行う。
[編集] IEEE方式(IEEE 754 形式)
IEEE 754 形式の単精度実数では、符号部 1 ビット ・ 指数部 8 ビット ・ 仮数部 23 ビット、倍精度では符号部 1 ビット ・ 指数部 11 ビット ・ 仮数部 52 ビットで表現されている。各部は次のように定義されている。
- 符号部は 0 を正、1 を負とする
- 指数部は符号なし2進整数とし、単精度では 127、倍精度では 1023 をバイアスした値で表す
- 仮数部は整数部分が 1 であるような2進小数の小数部分を表す。
つまり、IEEE 754 形式で表現する値は
- 単精度の場合: (-1) 符号部×2指数部 ‐127 ×(1+仮数部)
- 倍精度の場合: (-1) 符号部×2指数部 ‐1023×(1+仮数部)
である。
ただし、IEEE 754 形式の指数部は複雑で、以下のような役割も持つ。
- 指数部が、単精度の場合 255、倍精度の場合 2047、に等しいとき:
- 仮数部が 0 以外の場合は非数(NaN; Not a Number)を表す。
- 仮数部が 0 の場合は、符号部が 0 のときは正の無限大、符号部が 1 のときは負の無限大を表す。
- 指数部、仮数部ともに 0 のときは 0 を表す。
0 を 0 で割ろうとすると NaN になる。また、
も、求めるとNaNになる。
[編集] IEEE 754 で表現するまでの過程
2.5を 単精度 IEEE 754 で表現するには、次のようになる。
- 2.5×20
仮数部は1以下でなければならないため、値をシフトし正規化する。基数は2、コンピュータの内部表現は2進数であるため、シフト量は1ビットである。さらに、シフトして1⁄2になったことを相殺するために2の1乗を求める。 値をシフトすることで表現範囲を広げ、丸め誤差を少なくなるようにしている。この操作を正規化という。正規化は基数の1乗を求めればよい。
このままでは 1.25×21 となり1未満ではないが、仮数部は 仮数 - 1 と決められているため、次のようになる。
- 0.25×21
指数部は127をバイアスすることが決まっているため
- 0.25×2128
実際には2進数で表現されているので、2進数に直す。
- 符号部(1ビット):+→0
- 仮数部(23ビット):0.25→01000000000000000000000
- 指数部(8ビット):128→10000000
浮動小数点は 符号部 指数部 仮数部 の順で並べるため
- 2進値:0 10000000 01000000000000000000000、16進値:40200000
[編集] IBM方式(エクセス64 形式)
エクセス64の単精度実数では、符号部1ビット、指数部7ビット、仮数部24ビットで表現されている。各部は次のように定義されている。
- 符号部は0を正、1を負とする
- 指数部は16を基数とし、実際の指数に64を足した(ゲタ履き、バイアス)値で表す
- 仮数部は1以下の2進小数とする
符号部は値の符号を表す。 指数部は-1663~-16-64と16-64~1663の範囲が表現できる。これを下回れば算術アンダーフロー、上回れば算術オーバーフローとなる。
[編集] エクセス64で表現するまでの過程
1.5を単精度のエクセス64で表現するには、次のようになる。
- 1.5×160
仮数部は1以下でなければならないため、値をシフトする。ただし、基数が16で、コンピュータの内部表現は2進数であるため、シフト量は4ビットである(24 = 16)。加えて正規化し、その結果は次の通り。
- 0.09375×161
次に指数部をエクセス64で表現する。ただし、負の指数を表すために64をバイアスしなければならない。バイアスを行うと、0~127を表現できる指数が、-64~+63を表現できる指数になる(-64 + 64 = 0、63 + 64 = 127)。 よって、今回の例では以下のようになる。
- 0.09375×1665
実際には2進数で表現されているので、2進数に直す。
- 符号部(1ビット):+→0
- 仮数部(24ビット):0.09375→000110000000000000000000
- 指数部(7ビット):65→1000001
浮動小数点数の並び順は 符号部 指数部 仮数部 であるため、
- 2進値:0 1000001 000110000000000000000000、16進値:41180000
[編集] 浮動小数点数の精度
浮動小数点数は、表現の仕方から、固定小数点数と比べると誤差が生じやすい。浮動小数点数では次のような誤差が生じることがある。
- オーバーフロー/アンダーフロー
- 演算結果が指数部で表現できる範囲を超える場合があるが、最大値を超えた場合はオーバーフロー、絶対値の最小より小さい場合はアンダーフローという。たとえば、IEEE 754では、指数が2-129である場合、アンダーフローである。
- 桁落ち
- 絶対値がほぼ等しい数値同士の減算を行った際、正規化の際有効数字が減少すること。詳細は桁落ちを参照。
- 情報落ち
- 浮動小数点数値を加算するとき、指数を揃えなければならない。指数は大きい方に揃えるが、このときに非常に小さな値と非常に大きな値との加算を行うと、大きな値の指数に揃えなければならないため、小さな値は仮数部が大きくシフトされ、仮数部の表現範囲からあふれて情報が欠落してしまう。情報欠落ともいう。詳細は情報落ちを参照。
- 積み残し
- 情報落ちが繰り返し起こる場合を言う。たとえば
を n=0 の初項から計算しようとすると、ある項から情報落ちが起こり、それ以降の項が無視されてしまうことになる。これを積み残しと呼び、値の小さな項から加算をすることで対処する。 - 丸め誤差
- 浮動小数点数の内部表現は2進数であるため、各ビットの重みは1⁄2、1⁄4 ...となるが、1⁄3など、2進数で表せない重みが使われると無限小数となり、途中から切り捨てられるために誤差が出る。たとえば、0.05は2進小数にすると
...というように循環小数になる。こういう値は丸め誤差として現れてしまう。この誤差は固定小数点数でも10進数で表現していなければ必ず発生する。 - 打ち切り誤差
を計算することを考える。コンピューターは無限回の演算を行うことはできないので、どこかで演算を打ち切る必要があり、したがって真の値(この場合は2)に到達することはない。ここで生じる誤差を打ち切り誤差と呼ぶ。これは原理的な問題であり、浮動小数点数、固定小数点数を問わず、避けようがない。
[編集] 関連項目
[編集] 外部リンク
最終更新 2009年11月22日 (日) 16:16 (日時は個人設定で未設定ならばUTC)。
【浮動小数点数】変更履歴

