倍精度浮動小数点数のソースを表示
←
倍精度浮動小数点数
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
{{出典の明記|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]]では、単精度(<code>REAL</code>型)よりも精度が高ければ倍精度(<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]]:2008でbinary64として標準化されたパラメータは次の通りである。 * 符号ビット (<math>sign</math>): 1 ビット * 指数部 (<math>exponent</math>): 11 ビット * [[仮数]]部 (<math>fraction</math>): 52 ビット 指数部が全て 0(ゼロ、および[[非正規化数]])の場合を除き、仮数部で表現されるビットパターンのさらにひとつ上の桁に暗黙の 1 のビットがあるとみなす表現法(いわゆる「ケチ表現」)により、通常の数(正規化された数)の精度は、53ビット相当(十進に直すと約16桁、<math>53\log_{10}(2) \approx 15.955</math>)である。ビットのレイアウトは以下のようになる(具体的なレイアウトは、一般的なバイトアドレッシングのコンピュータにおいて、[[エンディアン]]の違いなどによる影響を受けることがあるが、それについては必ずしも標準化されていない)。 [[ファイル:IEEE_754_Double_Floating_Point_Format.svg]] 64ビットの「倍精度」データで表される実際の数値は、符号を <math>sign</math>、バイアスのある指数部を <math>e</math>、52ビットの仮数部のビット列を<math>b_n</math>とすると、<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>={{val|4503599627370496}} と 2<sup>53</sup>={{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>−52</sup> から 2<sup>−53</sup> までである。従って最も近い値への数値の丸め誤差の最大([[計算機イプシロン]])は 2<sup>−53</sup> となる。 === 指数部の符号化方式 === * E<sub>min</sub> (001<sub>16進</sub>) = −1022 * E (50) = −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でない)を表現するのに使われる。 従って、全てのビットパターンが符号として意味がある。これらの例外を除くと、倍精度浮動小数点数は次のように表される。 <math>(-1)^{\text{sign}} \times 2^{\text{exponent} - \text{exponent bias}} \times 1.\text{mantissa}</math> === 倍精度浮動小数点数の例 === {|class=wikitable !バイト列(16進法表記)!!バイト列が表現している値 |- |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> |- |4000 0000 0000 0000||<math>2</math> |- |C000 0000 0000 0000||<math>-2</math> |- |0000 0000 0000 0001||<math>\approx 4.9406564584124654\times 10^{-324}</math>(正の最小の非正規化数) |- |0010 0000 0000 0000||<math>\approx 2.2250738585072014\times 10^{-308}</math>(正の最小の正規化数) |- |7FEF FFFF FFFF FFFF||<math>\approx 1.7976931348623157\times 10^{308}</math>(倍精度浮動小数点数の最大値) |- |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> |- |3FD5 5555 5555 5555||<math>\approx\frac{1}{3}</math>(<math>\frac{1}{3}</math> は単精度とは異なり、切り下げられる。これは仮数部のビット数が奇数であるため。) |} より詳細な例として 3FD5 5555 5555 5555<sub>16進</sub> の場合は以下の通りに考える。 {|class=wikitable !項目!!値 |- |符号||0<sub>16進</sub> |- |指数部||3FD<sub>16進</sub>(=1021<sub>10進</sub>) |- |指数部バイアス||1023<sub>10進</sub> (上述) |- |仮数部||5 5555 5555 5555<sub>16進</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 |} == MSXの場合 == MSX-BASICの演算ルーチンMATHPACKの場合、同様に8バイトで表すが、IEEE 754とは異なり * s(符号ビット): 1 * y(指数部の幅): 7 * x(仮数部の幅): 56 syyy yyyy xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx であり、指数部をバイナリ、仮数部を[[二進化十進表現|BCD]]で表現する。 そのため、有効数字は正確に10進で14桁で、指数は±63乗である。 他のパソコンのBASICはほとんどが2進での演算であった(他にBCDを採用した機種として[[FP-1000]]がある)。 2進小数の主な利点は高速性とメモリ消費にあり、BCD小数の主な利点は現実の10進小数を誤差なく扱える事にあったと言ってよい。 2進小数は原理上0.5や0.25、0.375といったn/(2^m)以外の値、つまり0.1や0.2といった数値を正確に扱う事が苦手であり(表示上は補正されているが、10進小数を2進小数に変換すると殆どの場合循環小数となり、微小な切り捨てが発生する)高速性よりも(10進の世界での)正確性が優先されるようなケースにおいてBCD小数は強みを発揮した(各種利息計算など)。 ただし当時のスペックにおいて10進小数は相応に重い処理であり、DAAという10進補正用の専用CPU命令を持っていたZ80であっても複雑な演算になればなるほど(例えば三角関数や対数関数のような数学関数)2進小数より負荷が増していく。 MSX-BASICにおいて10進小数が採用された理由は、マイクロソフトBASICの中でも比較的後期に開発され新しい実装を試せた事、加えてホームコンピュータという需要の開拓においてより一般性を高めたいアスキー側の狙いがあったと考えられる。 CPUの浮動小数点ユニットとの相互運用を視野に入れなければならない現代の言語では、特殊な用途を除いてBCD小数を目にする機会は少ない。 == 関連項目 == * [[IEEE 754]] * [[浮動小数点数]] * {{コンピュータの数値精度}} ==脚注== <references group="註釈"/> {{データ型}} {{DEFAULTSORT:はいせいとふとうしようすうてんすう}} [[Category:コンピュータの算術]] [[Category:プログラミング]]
このページで使用されているテンプレート:
テンプレート:Val
(
ソースを閲覧
)
テンプレート:いつ範囲
(
ソースを閲覧
)
テンプレート:コンピュータの数値精度
(
ソースを閲覧
)
テンプレート:データ型
(
ソースを閲覧
)
テンプレート:出典の明記
(
ソースを閲覧
)
テンプレート:読み仮名 ruby不使用
(
ソースを閲覧
)
倍精度浮動小数点数
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報