浮動小数点数

del.icio.us del.icio.us
Digg Digg
Furl Furl
Reddit Reddit
Rojo Rojo
Add to OnlyWire

浮動小数点数ふどうしょうすうてんすう)は、コンピュータにおける実数の近似値の表現方式。

固定小数点数と比較するとさまざまな誤差が発生しやすいが、大きな値や、逆に小さな値を表現するのに向いている。そのため、誤差の概念がはっきりしている分野や極端な数を扱う分野(科学計算など)で多く用いられている。また、プログラミング言語のほとんどが対応しているということもあり、小数の表現方法としては最も普及している。

固定小数点数の演算と比べると演算速度が遅いため、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ビット表現(倍精度)とがある。

IEEE方式(IEEE 754 形式)

IEEE 754 形式の単精度実数では、符号部1ビット・指数部8ビット・仮数部23ビット、倍精度では符号部1ビット・指数部11ビット・仮数部52ビットで表現されている。各部は次のように定義されている。

  • 符号部は0を正、1を負とする
  • 指数部は2を基数とし、単精度では127、倍精度では1023をバイアスした値で表す
  • 仮数部は1以下の2進小数とする。ただし、仮数部=仮数 - 1とする

つまり、IEEE 754 形式で表現する値は

(-1)符号部×2指数部-127×(1+仮数部) -- 単精度の場合
(-1)符号部×2指数部-1023×(1+仮数部) -- 倍精度の場合

である。

ただし、IEEE 754 形式の指数部は複雑で、以下のような役割も持つ。

  • 指数部が255、仮数部が0以外の時は非数(NaN; Not a Number)を表す
  • 指数部が255、仮数部が0のとき、符号部が0のときは正の無限大、符号部が1のときは負の無限大
  • 指数部、仮数部ともに0のときは0

※0を0で割ろうとするとNaNになる。また、\sqrt{-1}も、求めるとNaNになる。

IEEE 754 で表現するまでの過程

2.5を 単精度 IEEE 754 で表現するには、次のようになる。

2.5×2⁰

仮数部は1以下でなければならないため、値をシフトし正規化する。基数は2、コンピュータの内部表現は2進数であるため、シフト量は1ビットである。さらに、シフトして{1 \over 2}になったことを相殺するために2の1乗を求める。 値をシフトすることで表現範囲を広げ、丸め誤差を少なくなるようにしている。この操作を正規化という。正規化は基数の1乗を求めればよい。

このままでは 1.25×2¹ となり1未満ではないが、仮数部は 仮数 - 1 と決められているため、次のようになる。

0.25×2¹

指数部は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×16⁰

仮数部は1以下でなければならないため、値をシフトする。ただし、基数が16で、コンピュータの内部表現は2進数であるため、シフト量は4ビットである(2⁴=16)。加えて正規化し、その結果は次の通り。

0.09375×16¹

次に指数部をエクセス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である場合、アンダーフローである。
桁落ち 
絶対値がほぼ等しい数値同士の減算を行った際、正規化の際有効数字が減少すること。詳細は桁落ちを参照。
情報落ち 
浮動小数点数値を加算するとき、指数を揃えなければならない。指数は大きい方に揃えるが、このときに非常に小さな値と非常に大きな値との加算を行うと、大きな値の指数に揃えなければならないため、小さな値は仮数部が大きくシフトされ、仮数部の表現範囲からあふれて情報が欠落してしまう。情報欠落ともいう。詳細は情報落ちを参照。
積み残し 
情報落ちが繰り返し起こる場合を言う。たとえば \sum_{n=0}^{100} \frac{1}{1.5^n} を n=0 の初項から計算しようとすると、ある項から情報落ちが起こり、それ以降の項が無視されてしまうことになる。これを積み残しと呼び、値の小さな項から加算をすることで対処する。
丸め誤差 
浮動小数点数の内部表現は2進数であるため、各ビットの重みは{1 \over 2}{1 \over 4}...となるが、{1 \over 3}など、2進数で表せない重みが使われると無限小数となり、途中から切り捨てられるために誤差が出る。たとえば、0.05は2進小数にすると0.000011001100110011001100\dot{1}10\dot{0}...というように循環小数になる。こういう値は丸め誤差として現れてしまう。この誤差は固定小数点数でも10進数で表現していなければ必ず発生する。
打ち切り誤差 
\sum_{n=0}^\infty \frac{1}{2^n} を計算することを考える。コンピューターは無限回の演算を行うことはできないので、どこかで演算を打ち切る必要があり、したがって真の値(この場合は2)に到達することはない。ここで生じる誤差を打ち切り誤差と呼ぶ。これは原理的な問題であり、浮動小数点数、固定小数点数を問わず、避けようがない。

関連項目

外部リンク

This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.


Giant Panda

Mercedes Car
James Bond Guide
This site monitored by SitePinger.net