「倍精度浮動小数点数」の版間の差分
削除された内容 追加された内容
(9人の利用者による、間の18版が非表示) | |||
1行目:
{{出典の明記|date=2019-07}}
{{読み仮名_ruby不使用|'''倍精度浮動小数点数'''|ばいせいどふどうしょうすうてんすう|{{lang-en-short|double
<!--double precisionという名前は、[[FORTRAN]]における型の名前が由来である。また現代の用語として、--><!-- ← ワードサイズについて、短いのとその倍長の2種類あるマシンは、Fortranよりも前に既に一般的になっていたはず-->
{{いつ範囲|date=2019-07|昔}}の[[FORTRAN]]では、単精度
システムで実数を表現する際に基本となる1語を用いて表現される数値を単精度(single-precision)であるといい、基本となる2語を用いて実現されたより高い精度の数値を倍精度(double-precision)であるという。基本となる実数型の語長はシステムに依存していて,32ビット、36ビット、48ビット、64ビットなどと様々だった。たとえば、CDC社の実数が64ビットの語長のシステムでは、FORTRAN言語でREALと宣言するとそれは1語が64ビットであり、DOUBLE PRECISIONと宣言するとそれは128ビットである。しかし、IEEE 754規格が制定された1980年頃からしだいに、規格で定義された内部2進で語長32ビットの形式の浮動小数点数および演算のことを単精度と呼び、規格で定義された内部2進で語長64ビットの形式の浮動小数点数とその演算のことを倍精度と呼ぶことが一般的になってきた。
浮動小数点算術に関する標準である[[IEEE 754]]では、単精度は32ビット(4[[オクテット (コンピュータ)|オクテット]])、倍精度は[[64ビット]](8オクテット)である。いずれにしろ、「倍」というのは、精度に関係する仮数部(後述)の長さが正確に2倍である、といったような意味ではなく、全体の長さが2倍である所から来ているので、実際の所「倍精度」というのはかなり大雑把な言い方に過ぎない。
== 倍精度浮動小数点数の形式 ==
倍精度浮動小数点数は単精度浮動小数点数に比べて性能や帯域幅のコストがかかるが、表現できる数値の範囲が広いため[[パーソナルコンピュータ|PC]]でもよく使われている。浮動小数点方式一般に言えることであるが(単精度の場合と同様)指数部に使われる部分があるために、同じサイズの固定長整数が表現可能な値のうち、ある範囲より絶対値が大きいものについては、その全てを正確に表現することはできない。[[IEEE 754]]
* 符号ビット (<math>sign</math>): 1 ビット
* 指数部 (<math>exponent</math>): 11 ビット
* [[仮数]]部 (<math>fraction</math>): 52 ビット
指数部が全て 0(ゼロ、および[[非正規化数]])の場合を除き、仮数部で表現されるビットパターンのさらにひとつ上の桁に暗黙の 1 のビットがあるとみなす表現法(いわゆる「ケチ表現」)により、通常の数(正規化された数)の精度は、53ビット相当
[[ファイル:IEEE_754_Double_Floating_Point_Format.svg]]
64ビットの「倍精度」データで表される実際の数値は、符号を
* <math> value = (-1)^{sign}(1 + \sum_{i=1}^{52} \ b_{-i}2^{-i} )\times 2^{(e-1023)}</math>
2<sup>52</sup>=
数値の小数部の間隔は 2<sup>''n''</sup> から 2<sup>''n''+1</sup> の範囲で 2<sup>
=== 指数部の符号化方式 ===
* E<sub>min</sub> (001<sub>16進</sub>) =
* E (50) =
* E<sub>max</sub> (7FE<sub>16進</sub>) = 1023
* 指数部バイアス (3FF<sub>16進</sub>) = 1023
指数部バイアスは、エクセスNとも言う。詳しくは[[符号付数値表現]]を参照されたい。真の指数値は、指数部の値から指数部バイアスを引いた値となる。
000<sub>16進</sub> と 7FF<sub>16進</sub> は予約された指数値である。
* 000<sub>16進</sub> は 0(仮数部も0)と[[非正規化数]](仮数部が0でない)を表現するのに使われる。
* 7FF<sub>16進</sub> は[[無限|無限大]](仮数部が0)や[[NaN]](仮数部が0でない)を表現するのに使われる。
従って、全てのビットパターンが符号として意味がある。これらの例外を除くと、倍精度浮動小数点数は次のように表される。
44 ⟶ 46行目:
=== 倍精度浮動小数点数の例 ===
{|class=wikitable
!バイト列(16進法表記)!!バイト列が表現している値
|-
|-
|3FF0 0000 0000 0001||<math>1.0000000000000002220446049250313080847263336181640625</math><ref group="註釈">1より大きい最小の数</ref>
|-
|3FF0 0000 0000 0002||<math>1.000000000000000444089209850062616169452667236328125</math>
|-
|-
|C000 0000 0000 0000||<math>-2</math>
|-
|-
|-
|-
|-
|8000 0000 0000 0000||<math>-0</math>
|-
|7FF0 0000 0000 0000||<math>+\infty</math>
|-
|FFF0 0000 0000 0000||<math>-\infty</math>
|-
|}
より詳細な例として 3FD5 5555 5555 5555<sub>16進</sub> の場合は以下の通りに考える。
▲ 0x3ff0 0000 0000 0000 = 1
▲ 0x4000 0000 0000 0000 = 2
{|class=wikitable
▲ 0x0000 0000 0000 0001 ≈ 4.9406564584124654 x 10<sup>-324</sup> (正の最小の非正規化数)
!項目!!値
▲ 0x0010 0000 0000 0000 ≈ 2.2250738585072014 x 10<sup>-308</sup> (正の最小の正規化数)
|-
▲ 0x7fef ffff ffff ffff ≈ 1.7976931348623157 x 10<sup>308</sup> (倍精度浮動小数点数の最大値)
|符号||0<sub>16進</sub>
|-
▲ 0x0000 0000 0000 0000 = 0
|指数部||3FD<sub>16進</sub>(=1021<sub>10進</sub>)
|-
|-
|-
|値||2<sup>(指数部 − 指数部バイアス)</sup> × 1.仮数部 ※仮数部はこの段階では十進に変換されない<br>= 2<sup>−2</sup> × (15 5555 5555 5555<sub>16進</sub> × 2<sup>−52</sup>)<br>= 2<sup>−54</sup> × 15 5555 5555 5555<sub>16進</sub><br>= 0.333333333333333314829616256247390992939472198486328125<br>≈ 1/3
▲(1/3 は[[単精度]]とは異なり、切り下げられる。これは仮数部のビット数が奇数であるため。)
|}
▲ 指数部バイアス = 1023 (上述)
▲ 仮数部 = 0x5 5555 5555 5555
== MSXの場合 ==
93 ⟶ 109行目:
CPUの浮動小数点ユニットとの相互運用を視野に入れなければならない現代の言語では、特殊な用途を除いてBCD小数を目にする機会は少ない。
==脚注==▼
== 関連項目 ==
* [[IEEE 754]]
* [[浮動小数点数]]
* {{コンピュータの数値精度}}▼
▲==脚注==
<references group="註釈"/>
▲{{コンピュータの数値精度}}
{{データ型}}
{{DEFAULTSORT:はいせいとふとうしようすうてんすう}}
|