「倍精度浮動小数点数」の版間の差分

削除された内容 追加された内容
 
(9人の利用者による、間の18版が非表示)
1行目:
{{出典の明記|date=2019-07}}
{{読み仮名_ruby不使用|'''倍精度浮動小数点数'''|ばいせいどふどうしょうすうてんすう|{{lang-en-short|double -precision floating -point number}}}}は、64ビットの[[浮動小数点数]]表現である。
 
<!--double precisionという名前は、[[FORTRAN]]における型の名前が由来である。また現代の用語として、--><!-- ← ワードサイズについて、短いのとその倍長の2種類あるマシンは、Fortranよりも前に既に一般的になっていたはず-->精度と言うの[[単精度浮動小数点数|単精度]]に対してそのように言うわけだがする表現であり、これは[[32ビット]]を1ワードとする32ビットアーキテクチャをもとにしている。
 
{{いつ範囲|date=2019-07|昔}}の[[FORTRAN]]では、単精度(REAL(<code>REAL</code>型)よりも精度が高ければ倍精度(DOUBLE(<code>DOUBLE PRECISION</code>型)を名乗ることができた(そもそもワードの長さも浮動小数点のフォーマットも機種ごとにまちまちだった)。IBMの[[System/360]]採用されして同社の大型計算とそ他社の互換機種における事実上の標準となった、指数の基数16とするIBM浮動小数点形式は、32ビット単精度では最悪の場合の精度が十進で6桁程度となり、精度を要する科学技術計算では倍精度以上を使わねばならないという問題があった。(注:FORTRAN言語で<code>REAL</code>型が1ワード、<code>DOUBLE PRECISION</code>型が2ワードを記憶上で占めるという前提だった)
 
システムで実数を表現する際に基本となる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]] :2008binary64として標準化されたパラメータは次の通りである。
 
* 符号ビット (<math>sign</math>): 1 ビット
* 指数部 (<math>exponent</math>): 11 ビット
* [[仮数]]部 (<math>fraction</math>): 52 ビット
 
指数部が全て 0(ゼロ、および[[非正規化数]])の場合を除き、仮数部で表現されるビットパターンのさらにひとつ上の桁に暗黙の 1 のビットがあるとみなす表現法(いわゆる「ケチ表現」)により、通常の数(正規化された数)の精度は、53ビット相当<ref>「精度とはビット数のこと」という理解には落とし穴がある。</ref>(十進に直すと約16桁、<math>53\log_{10}(2) \approx 15.955</math>)である。ビットのレイアウトは以下のようになる(具体的なレイアウトは、一般的なバイトアドレッシングのコンピュータにおいて、[[エンディアン]]の違い(endianness)などによる影響を受けることがあるが、それについては必ずしも標準化されていない)。
 
[[ファイル:IEEE_754_Double_Floating_Point_Format.svg]]
 
64ビットの「倍精度」データで表される実際の数値は、符号を '''<math>sign'''</math>、バイアスのある指数部を '''<math>e'''</math>、52ビットの仮数部のビット列を'''b<submath>nb_n</submath>'''とすると、<math> = (-1)^{sign}(1.b_{-1}b_{-2}...\cdots{}b_{-52})_2 \times 2^{e-1023} </math> となり、より正確に表すと次のようになる。
* <math> value = (-1)^{sign}(1 + \sum_{i=1}^{52} \ b_{-i}2^{-i} )\times 2^{(e-1023)}</math>
 
2<sup>52</sup>=4,503,599,627,370,496{{val|4503599627370496}} と 2<sup>53</sup>=9,007,199,254,740,992{{val|9007199254740992}} の間で表現できる数値は正確に整数に対応している。2<sup>53</sup> から 2<sup>54</sup> までの範囲では、常にその2倍となるので、偶数しか表現できない。逆に 2<sup>51</sup> と 2<sup>52</sup> の間の範囲では間隔が0.5になる。
 
数値の小数部の間隔は 2<sup>''n''</sup> から 2<sup>''n''+1</sup> の範囲で 2<sup>-&minus;52</sup> から 2<sup>-&minus;53</sup> までである。従って最も近い値への数値の丸め誤差の最大([[計算機イプシロン]])は 2<sup>-&minus;53</sup> となる。
 
=== 指数部の符号化方式 ===
 
* E<sub>min</sub> (001<sub>16</sub>) = -&minus;1022
* E (50) = -&minus;973
* 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進法表記)!!バイト列が表現している値
|-
0x3ff0|3FF0 0000 0000 0000 = ||<math>1</math>
|-
|3FF0 0000 0000 0001||<math>1.0000000000000002220446049250313080847263336181640625</math><ref group="註釈">1より大きい最小の数</ref>
|-
|3FF0 0000 0000 0002||<math>1.000000000000000444089209850062616169452667236328125</math>
|-
0x4000|4000 0000 0000 0000 = ||<math>2</math>
|-
|C000 0000 0000 0000||<math>-2</math>
|-
0x0000|0000 0000 0000 0001||<math>\approx 4.9406564584124654 x\times 10<sup>^{-324}</supmath> (正の最小の非正規化数)
|-
0x0010|0010 0000 0000 0000||<math>\approx 2.2250738585072014 x\times 10<sup>^{-308}</supmath> (正の最小の正規化数)
|-
0x7fef|7FEF ffffFFFF ffffFFFF ffff ≈FFFF||<math>\approx 1.7976931348623157 x\times 10<sup>^{308}</supmath> (倍精度浮動小数点数の最大値)
|-
0x0000|0000 0000 0000 0000 = ||<math>0</math>
|-
|8000 0000 0000 0000||<math>-0</math>
|-
|7FF0 0000 0000 0000||<math>+\infty</math>
|-
|FFF0 0000 0000 0000||<math>-\infty</math>
|-
(1|3FD5 5555 5555 5555||<math>\approx\frac{1}{3}</math>(<math>\frac{1}{3}</math>[[単精度]]とは異なり、切り下げられる。これは仮数部のビット数が奇数であるため。)
|}
 
より詳細な例として 3FD5 5555 5555 5555<sub>16進</sub> の場合は以下の通りに考える。
0x3ff0 0000 0000 0000 = 1
0x3ff0 0000 0000 0001 = 1.0000000000000002、1より大きい最小の数
0x3ff0 0000 0000 0002 = 1.0000000000000004
0x4000 0000 0000 0000 = 2
0xc000 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>)
0x8000 0000 0000 0000 = –0
|-
 
|指数部バイアス = ||1023<sub>10進</sub> (上述)
0x7ff0 0000 0000 0000 = 正の無限大
|-
0xfff0 0000 0000 0000 = 負の無限大
|仮数部 = 0x5||5 5555 5555 5555<sub>16進</sub>
 
|-
0x3fd5 5555 5555 5555 ≈ 1/3
|値||2<sup>(指数部 − 指数部バイアス)</sup> × 1.仮数部 ※仮数部はこの段階では十進に変換されない<br>= 2<sup>&minus;2</sup> × (15 5555 5555 5555<sub>16進</sub> × 2<sup>&minus;52</sup>)<br>= 2<sup>&minus;54</sup> × 15 5555 5555 5555<sub>16進</sub><br>= 0.333333333333333314829616256247390992939472198486328125<br>≈ 1/3
(1/3 は[[単精度]]とは異なり、切り下げられる。これは仮数部のビット数が奇数であるため。)
|}
 
より詳細な例:
[[十六進法|16進]]表現で 0x3fd5 5555 5555 5555 の場合、
符号 = 0x0
指数部 = 0x3fd = 1021
指数部バイアス = 1023 (上述)
仮数部 = 0x5 5555 5555 5555
値 = 2<sup>(指数部 − 指数部バイアス)</sup> × 1.仮数部 – 仮数部はこの段階では十進に変換されない
= 2<sup>–2</sup> × (0x15 5555 5555 5555 × 2<sup>–52</sup>)
= 2<sup>–54</sup> × 0x15 5555 5555 5555
= 0.333333333333333314829616256247390992939472198486328125
≈ 1/3
 
== MSXの場合 ==
93 ⟶ 109行目:
 
CPUの浮動小数点ユニットとの相互運用を視野に入れなければならない現代の言語では、特殊な用途を除いてBCD小数を目にする機会は少ない。
 
==脚注==
{{Reflist}}
 
== 関連項目 ==
* [[IEEE 754]]
* [[浮動小数点数]]
* {{コンピュータの数値精度}}
==脚注==
<references group="註釈"/>
 
{{コンピュータの数値精度}}
{{データ型}}
{{DEFAULTSORT:はいせいとふとうしようすうてんすう}}