📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の13版が非表示)
15行目: 15行目:


== IEEE 754形式 ==
== IEEE 754形式 ==
==== 例: IEEE754形式への変換 ====
==== 例: IEEE754形式 (単精度浮動小数点数) への変換 ====
IEEE 754 単精度浮動小数点数は、コンピュータで浮動小数点数を表現するための標準規格である。<br>
これにより、異なるコンピュータやプログラム間で一貫した数値演算が可能になる。<br>
<br>
単精度浮動小数点数は、32ビット (4バイト) で表現される。<br>
その内訳を以下に示す。<br>
* 符号部 : 1ビット
*: 符号部は、数値の正負を表す。
*: 0 = 正の数
*: 1 = 負の数
* 指数部 : 8ビット
*: 指数部は、数値を2の何乗するかを示す。
*: 指数部はバイアス (基準となる値) として127を用いたバイアス形式で表現される。
*: 指数部 eは、実際の指数 Eからバイアス (127) を加算することにより求められる。
*: <math>\mbox{ 指 数 部 } \, \, e = \mbox{E} + 127</math>
*: <br>
*: 最小の正規化指数: <math>00000001_{(2)} = -126_{(10)}</math>
*: 最大の正規化指数: <math>11111110_{(2)} = 127_{(10)}</math>
* 仮数部 : 23ビット
*: 仮数部は、数値の有効桁 (精度) を表す。
*: 仮数部は、通常、1.XXXX...の形で表現され、仮数部にはこの小数部分が格納される。 (先頭の1は省略される)
<br>
[[ファイル:IEEE754 Float Block Diagram.jpg|フレームなし|中央]]
<br>
===== 例: 9.875<sub>(10)</sub> =====
===== 例: 9.875<sub>(10)</sub> =====
以下の例では、<math>9.875_{(10)}</math> をIEEE754形式の浮動小数点に変換している。<br>
以下の例では、<math>9.875_{(10)}</math> をIEEE754形式の浮動小数点に変換している。<br>
76行目: 99行目:
# 変換完了
# 変換完了
#: これにより、<math>0.3125_{(10)}</math> をIEEE754形式の32ビットの浮動小数点数にした値は <math>00111110110100000000000000000000_{(2)}</math> となる。
#: これにより、<math>0.3125_{(10)}</math> をIEEE754形式の32ビットの浮動小数点数にした値は <math>00111110110100000000000000000000_{(2)}</math> となる。
<br>
===== 例: 01000000101000000000000000000000<sub>(2)</sub> =====
例えば、以下に示すような単精度浮動小数点数があるとする。<br>
01000000101000000000000000000000
<br>
この単精度浮動小数点数を、符号部、指数部、仮数部に分解する。<br>
* 符号部
*: 0 (正の数)
* 指数部
*: 10000001<sub>(2)</sub> = 129<sub>(10)</sub>
*: 実際の指数 <math>E = 129 - 127 = 2</math>
* 仮数部
*: 01000000000000000000000<sub>(2)</sub>は、10進数で1.25<sub>(10)</sub>
<br>
したがって、この数値は以下に示すように解釈される。<br>
<math>(+1) \times 1.25 \times 2^{2} = 1.25 \times 4 = 5.0</math><br>
<br>
==== 例: IEEE754形式 (倍精度浮動小数点数) への変換 ====
IEEE 754 倍精度浮動小数点数 (double-precision floating-point number) は、コンピュータで浮動小数点数を表現するための標準規格である。<br>
これにより、異なるコンピュータやプログラム間で一貫した数値演算が可能になる。<br>
<br>
倍精度浮動小数点数は、64ビット (8バイト) で表現される。<br>
その内訳を以下に示す。<br>
* 符号部 (Sign bit) : 1ビット
*: 符号部は、数値の正負を表す。
*: 0 = 正の数
*: 1 = 負の数
* 指数部 (Exponent) : 11ビット
*: 指数部は、数値を2の何乗するかを示す。
*: 指数部はバイアス (基準となる値) として1023を用いたバイアス形式で表現される。
*: 指数部 eは、実際の指数 Eからバイアス (1023) を加算することにより求められる。
*: <math>\mbox{ 指 数 部 } \, \, e = \mbox{E} + 1023</math>
*: <br>
*: 最小の正規化指数: <math>00000000001_{(2)} = -1022_{(10)}</math>
*: 最大の正規化指数: <math>11111111110_{(2)} = 1023_{(10)}</math>
* 仮数部 (Mantissa or Significand) : 52ビット
*: 仮数部は、数値の有効桁 (精度) を表す。
*: 仮数部は、通常、1.XXXX...の形で表現され、仮数部にはこの小数部分が格納される。 (先頭の1は省略される)
<br>
IEEE 754 倍精度浮動小数点数は以下の形式で表される。<br>
<math>(-1)^{S} \times 1.M \times 2^{E}</math><br>
* S : 符号部
* M : 仮数部
* E : 指数部
<br>
[[ファイル:IEEE754 Double Block Diagram.jpg|フレームなし|中央]]
<br>
===== 例 : 倍精度浮動小数点数 =====
例えば、以下に示すような倍精度浮動小数点数があるとする。<br>
0100000000110100000000000000000000000000000000000000000000000000
<br>
この倍精度浮動小数点数を、符号部、指数部、仮数部に分解する。<br>
* 符号部
*: 0 (正の数)
* 指数部
*: 10000000011<sub>(2)</sub> = 1027<sub>(10)</sub>
*: 実際の指数 <math>E = 1027 - 1023 = 4</math>
* 仮数部
*: 0100000000000000000000000000000000000000000000000000<sub>(2)</sub>は、10進数で1.25<sub>(10)</sub>
<br>
したがって、この数値は以下に示すように解釈される。<br>
<math>(+1) \times 1.25 \times 2^{4} = 1.25 \times 16 = 20.0</math><br>
<br>
==== 特殊な値 ====
* ゼロ
*: 符号部が0または1で、指数部と仮数部が全て0の場合
* 無限大
*: 符号部が0または1で、指数部が全て1、仮数部が全て0の場合
* NaN (Not a Number)
*: 指数部が全て1で、仮数部が0以外の場合
<br><br>
<br><br>


== 浮動小数点数の構造  ==
== 浮動小数点数の構造  ==
==== ケチ表現 (正規化数) について ====
仮数部は、2進数で1.xxxxx...という形式で表現される。<br>
小数点の前の1は暗黙的に存在する (ケチ表現) とみなされる。<br>
<br>
そのため、例えば、仮数部が23ビットの場合は実質24ビット分の精度を得ることができる。<br>
<br>
==== 単精度浮動小数点数(float型) ====
==== 単精度浮動小数点数(float型) ====
単精度浮動小数点数(float型)は、4バイトのサイズを持ち、符号部(1bit)、指数部(8bit)、仮数部(23bit)で表す。<br>
単精度浮動小数点数(float型)は、4バイトのサイズを持ち、符号部(1bit)、指数部(8bit)、仮数部(23bit)で表す。<br>
<br>
<br>
指数部は、-127のバイアスが掛かる。<br>
<u>指数部は、実際の指数 + 127のバイアスが掛かる。</u><br>
仮数部は、仮数の小数点以下を表す。すなわち、仮数は仮数部の先頭に1(ケチ表現)を付加したものとなる。<br>
仮数部は、仮数の小数点以下を表す。すなわち、仮数は仮数部の先頭に1(ケチ表現)を付加したものとなる。<br>
  単精度浮動小数点数(float型)の表す値 = (-1)<sup>符号部</sup> × 2<sup>(指数部 - 127)</sup> × 1.仮数部
  単精度浮動小数点数(float型)の表す値 = (-1)<sup>符号部</sup> × 2<sup>指数部 = (実際の指数 + 127)</sup> × 1.仮数部
<br>
* 仮数部 : 2進数から10進数への変換
*: 2進数24桁は、<math>\log_{10} 2^{24} \cong 7.22 ...</math><br>
<br>
したがって、単精度浮動小数点数(float型)の精度(有効桁数)は、2進数では24 (= 23 + 1) 桁、10進数では約7桁となる。<br>
<br>
<br>
単精度浮動小数点数(float型)の精度(有効桁数)は、2進数では24(=23 + 1)桁、10進数では約7桁となる。<br>
指数部も有限であるため、単精度浮動小数点数(float型)で表すことのできる実数の絶対値は、以下の範囲に限られる。<br>
指数部も有限であるため、単精度浮動小数点数(float型)で表すことのできる実数の絶対値は、以下の範囲に限られる。<br>
<math>1.175494 \times 10^{-38} < x < 3.402823 \times 10^{38}</math><br>
<math>1.175494 \times 10^{-38} < x < 3.402823 \times 10^{38}</math><br>
99行目: 204行目:
     printf("FLT_MIN = %e,  FLT_MAX =%e\n", FLT_MIN, FLT_MAX);
     printf("FLT_MIN = %e,  FLT_MAX =%e\n", FLT_MIN, FLT_MAX);
   
   
  return 0;
    return 0;
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== 倍精度浮動小数点数(double型) ====
==== 倍精度浮動小数点数(double型) ====
倍精度浮動小数点数(double型)は、単精度浮動小数点数(float型)に比べて、倍の精度(8byte)を持ち、符号部(1bit)、指数部(11bit)、仮数部(52bit)で表す。<br>
倍精度浮動小数点数(double型)は、単精度浮動小数点数(float型)に比べて、倍の精度(8byte)を持ち、符号部(1bit)、指数部(11bit)、仮数部(52bit)で表す。<br>
<br>
<br>
指数部は、-1023のバイアスが掛かる。<br>
<u>指数部は、実際の指数 + 1023のバイアスが掛かる。</u><br>
仮数部は、仮数の小数点以下を表す。すなわち、仮数は仮数部の先頭に1(ケチ表現) を付加したものとなる。<br>
仮数部は、仮数の小数点以下を表す。<br>
  倍精度浮動小数点数(double型)の表す値 = (-1)<sup>符号部</sup> × 2<sup>(指数部 - 1023)</sup> × 1.仮数部
すなわち、仮数は仮数部の先頭に1 (ケチ表現) を付加したものとなる。<br>
  倍精度浮動小数点数(double型)の表す値 = (-1)<sup>符号部</sup> × 2<sup>指数部 = (実際の指数 + 1023)</sup> × 1.仮数部
<br>
<br>
倍精度浮動小数点数(double型)の精度(有効桁数)は、2進数では53(=52 + 1)桁、10進数では約15桁となる。<br>
* 仮数部 : 2進数から10進数への変換
*: 2進数24桁は、<math>\log_{10} 2^{53} \cong 15.954 ...</math><br>
<br>
したがって、倍精度浮動小数点数(double型)の精度(有効桁数)は、2進数では53 (= 52 + 1) 桁、10進数では約15桁 (16桁弱) となる。<br>
<br>
<br>
指数部も有限であるため、倍精度浮動小数点数(double型)で表すことができる実数の絶対値は、以下の範囲に限られる。<br>
指数部も有限であるため、倍精度浮動小数点数(double型)で表すことができる実数の絶対値は、以下の範囲に限られる。<br>
152行目: 262行目:
例.<br>
例.<br>
以下のような絶対値のほぼ等しい値があるとする。<br>
以下のような絶対値のほぼ等しい値があるとする。<br>
A = 1.1111111123334455667788<br>
<math>A = 1.1111111123334455667788</math><br>
B = 1.111111111111111111111122<br>
<math>B = 1.111111111111111111111122</math><br>
<br>
<br>
A - Bを行った後、正規化する。<br>
<math>A - B</math> を行った後、正規化する。<br>
1.2223344556666×10<sup>-7</sup> (1)<br>
<math>1.2223344556666 \times 10^{-7} \quad \cdots \, \mbox{(1)}</math><br>
<br>
<br>
上記を、有効桁数10桁の浮動小数点数で計算する。<br>
上記を、有効桁数10桁の浮動小数点数で計算する。<br>
a = 1.111111123<br>
<math>a = 1.111111123</math><br>
b = 1.111111111<br>
<math>b = 1.111111111</math><br>
<br>
<br>
a - bを行った後、正規化する。<br>
<math>a - b</math> を行った後、正規化する。<br>
1.200000000×10<sup>-7</sup> (2)<br>
<math>1.200000000 \times 10^{-7} \quad \cdots \, \mbox{(2)}</math><br>
<br>
<br>
上記の(1)を有効桁数10桁に変換する。<br>
上記の演算結果(1)を有効桁数10桁に変換する。<br>
(2)(1)と比べて桁数が減少して、ほぼ等しい値にも関わらず、大きな誤差が生じていることが分かる。<br>
演算結果(2)は、演算結果(1)と比べて桁数が減少して、ほぼ等しい値にもかかわらず大きな誤差が生じていることが分かる。<br>
1.222334455×10<sup>-7</sup> … (1)<br>
<math>1.222334455 \times 10^{-7} \quad \cdots \, \mbox{(1)}</math><br>
1.200000000×10<sup>-7</sup> … (2)<br>
<math>1.200000000 \times 10^{-7} \quad \cdots \, \mbox{(2)}</math><br>
<br>
<br>
==== 情報落ち ====
==== 情報落ち ====
178行目: 288行目:
以下のような大きな値と小さい値があるとする。<br>
以下のような大きな値と小さい値があるとする。<br>
A=1100000000000<br>
<math>A = 1100000000000</math><br>
B=0.11<br>
<math>B = 0.11</math><br>
<br>
<br>
両方の値を有効桁数10桁の浮動小数点数に変換する。<br>
両方の値を有効桁数10桁の浮動小数点数に変換する。<br>
a = 1.100000000×10<sup>12</sup><br>
<math>a = 1.100000000 \times 10^{12}</math><br>
b = 1.100000000×10<sup>-1</sup><br>
<math>b = 1.100000000 \times 10^{-1}</math><br>
<br>
<br>
この時、bの指数をaに合わせると仮数部が0となり情報が落ちる。<br>
この時、bの指数をaに合わせると仮数部が0となり情報が落ちる。<br>
b = 0.000000000×10<sup>12</sup><br>
<math>b = 0.000000000 \times 10^{12}</math><br>
<br>
<br>
==== 打ち切り誤差 ====
==== 打ち切り誤差 ====
無限小数等の値に対して、ある程度の時点で処理を打ち切ることで発生する誤差のことである。<br>
無限小数等の値に対して、ある程度の時点で処理を打ち切ることで発生する誤差のことである。<br>
200行目: 309行目:


__FORCETOC__
__FORCETOC__
[[カテゴリ:C]][[カテゴリ:C++]][[カテゴリ:MFC]][[カテゴリ:Qt]][[カテゴリ:C_Sharp]]
[[カテゴリ:C]][[カテゴリ:C++]][[カテゴリ:MFC]][[カテゴリ:Qt]][[カテゴリ:C_Sharp]][[カテゴリ:Rust]][[カテゴリ:Python]][[カテゴリ:Web]]