コンピュータの数値形式

コンピュータ数値形式は、プログラム可能なコンピュータ計算機などのデジタル機器のハードウェアおよびソフトウェアにおける数値の内部表現です[1] 数値は、バイトやワードなどのビットのグループとして格納されます。数値とビットパターン間のエンコードは、コンピュータの操作の利便性を考慮して選択されます。[要出典]コンピュータの命令セットで使用されるエンコードは、通常、印刷や表示などの外部使用のために変換が必要です。異なるタイプのプロセッサは数値の内部表現が異なる場合があります。また、整数と実数には異なる規則が使用されます。ほとんどの計算はプロセッサレジスタに収まる数値形式で実行されますが、一部のソフトウェアシステムでは、複数ワードのメモリを使用して任意の大きな数値を表現できます。

2進数表現

コンピュータはデータを2進数の集合で表現します。この表現はビットで構成され、ビットはさらにバイトなどのより大きな集合にグループ化されます。

表1: 2進数から8進数へ
バイナリ文字列8進数値
0000
0011
0102
0113
1004
1015
1106
1117
表 2: ビット文字列の値の数。
ビット列の長さ(b)可能な値の数(N)
12
24
38
416
532
664
7128
8256
9512
101024
...

ビットは、2つの状態のうちの1つを表す2進 です。ビットの概念は、1または0オンまたはオフはいまたはいいえまたは偽のいずれかの値、あるいは何らかの スイッチやトグルによってエンコードされた値として理解できます。

1ビットだけでは2つの値しか表現できませんが、ビット列を用いることでより大きな値を表現できます。例えば、表1に示すように、3ビットのビット列は最大8つの異なる値を表現できます。

文字列を構成するビット数が増加すると、01の組み合わせの数は指数関数的に増加します。1ビットでは2つの値の組み合わせしか許されませんが、2ビットの組み合わせでは4つの値、3ビットの組み合わせでは8つの値、というように、2 nの式で増加します。表2に示すように、2進数の桁が追加されるごとに、可能な組み合わせの数は倍増します。

特定の数のビットによるグループ化は、さまざまなものを表すために使用され、特定の名前が付けられます。

バイト、文字を表すために必要なビット数を含むビット文字列です。ほとんどの最近のコンピュータでは、これは 8 ビット文字列です。バイトの定義は文字を構成するビット数に関連しているため、一部の古いコンピュータではバイトに異なるビット長が使用されていました。[2] 多くのコンピュータアーキテクチャでは、バイトはアドレス指定可能な最小単位、つまりアドレス指定可能領域の原子です。たとえば、64 ビットプロセッサが一度に 64 ビットのメモリをアドレス指定できるとしても、そのメモリを 8 ビットの断片に分割する場合があります。これはバイトアドレス指定可能なメモリと呼ばれます。歴史的に、多くのCPU は8 ビットの倍数でデータを読み取ります。[3] 8 ビットのバイトサイズは非常に一般的ですが、定義が標準化されていないため、 8 ビットのシーケンスを明示的に表すためにオクテット という用語が使用されることがあります。

ニブルニブルとも呼ばれる)、4ビットで構成される数値です。[4]ニブルはハーフバイト であるため、言葉遊びとして名付けられました。人が何かを一口食べるのに複数のニブルを必要とすることがあるように、ニブルはバイトの一部です。4ビットで16個の値を表現できるため、ニブルは16進数と呼ばれることもあります。[5]

8進数と16進数の表示

8進数と16進数は、コンピュータで使用される2進数を表す便利な方法です。コンピュータエンジニアは2進数の値を書き出す必要がし​​ばしばありますが、実際には1001001101010001のような2進数を書き出すのは面倒で、間違いが起きやすいです。そのため、2進数は8進数、つまり「8進数」、あるいはより一般的には16進数、つまり「16進数」(hex)という数値形式で表記されます。10進数では0から9までの10桁の数字が組み合わさって数値を形成します。8進数では0から7までの8桁の数字しか存在しません。つまり、8進数の「10」は10進数の「8」と同じであり、8進数の「20」は10進数の「16」と同じであり、以下同様です。 16進数では、0から9までの16桁の数字に、慣例的にAからFが続きます。つまり、16進数の「10」は10進数の「16」と同じであり、16進数の「20」は10進数の「32」と同じです。異なる基数における数値の例と比較については、以下の表をご覧ください。

数値を入力するときは、数値システムを説明するために書式設定文字が使用されます。たとえば、2 進数の場合は 000_0000B または 0b000_00000、16 進数の場合は 0F8H または 0xf8 です。

基数間の変換

表3: 異なる基準における値の比較
小数点バイナリ8進数16進数
00000000000
10000010101
20000100202
30000110303
40001000404
50001010505
60001100606
70001110707
80010001008
90010011109
10001010120A
11001011130B
12001100140℃
13001101150D
14001110160E
15001111170F

これらの記数法はいずれも位置に基づく記数法ですが、10進数の重みは10の累乗であるのに対し、8進数の重みは8の累乗、16進数の重みは16の累乗です。16進数または8進数を10進数に変換するには、各桁の値とその位置の値を掛け合わせ、その結果を加算します。例えば、次のようになります。

分数を2進数で表す

固定小数点数

固定小数点形式は、分数を 2 進数で表すのに役立ちます。

数値の小数部と整数部を格納するには、必要な精度と範囲に応じて必要なビット数を選択する必要があります。例えば、32ビット形式の場合、整数部に16ビット、小数部に16ビットを使用します。

8の位のビットの次には4の位のビット、2の位のビット、そして1の位のビットが続きます。小数ビットは整数ビットで設定されたパターンを継続します。次のビットは2分の1のビット、次に4分の1のビット、そして8分の1のビット、というように続きます。例えば:

整数ビット小数ビット
0.5001/200000000 00000000.10000000 00000000
1.250⁠1+1/400000000 00000001.01000000 00000000
7.375⁠7+3/800000000 00000111.01100000 00000000

この形式のエンコードでは、一部の値をバイナリで表現できません。例えば、分数1/5、小数で0.2の場合、最も近い近似値は次のとおりです。

13107 / 6553600000000 00000000.00110011 001100110.1999969...(10進数)
13108 / 6553600000000 00000000.00110011 001101000.2000122...(10進数)

より多くの桁数を使用しても、正確な表現は不可能です1/3⁠ は、10進数で0.333333333...と表され、無限に続きます。途中で終了した場合、その値はを表しません。1/3まさにそうです。

浮動小数点数

デジタルシステムでは符号なし整数と符号付き整数の両方が使用されていますが、32ビット整数でさえ、計算機が扱える数値の範囲全体を扱うには不十分です。しかも、これは分数さえも含みません。実数のより広い範囲と精度に近似するには、符号付き整数と固定小数点数を放棄し、「浮動小数点」形式に移行する必要があります。

10 進法では、次のような形式の浮動小数点数(科学的記数法)がよく知られています。

1.1030402 × 10 5 = 1.1030402 × 100000 = 110304.02

あるいは、もっと簡潔に言うと:

1.1030402E5

これは「1.1030402 に 1 を掛け、その後に 0 を 5 個続ける」という意味です。「仮数部」と呼ばれる数値(1.1030402)に、10 の累乗(E5、つまり 10 の 5 乗つまり 100,000 )を掛けたものが「指数部」です。指数が負の場合、その数値は小数点の右側の桁数だけ 1 を掛けた値になります。例えば、

2.3434E−6 = 2.3434 × 10 −6 = 2.3434 × 0.000001 = 0.0000023434

この方式の利点は、指数を用いることで、仮数部の桁数、つまり「数値精度」が数値範囲よりもはるかに小さい場合でも、はるかに広い範囲の数値を取得できることです。コンピュータ向けにも同様の2進浮動小数点形式を定義できます。このような方式は数多くありますが、最も一般的なものは電気電子学会(IEEE)によって定義されたものです。IEEE 754-2008標準仕様では、以下の64ビット浮動小数点形式が定義されています。

  • 11ビットの2進指数で、「1023超過」形式を使用します。1023超過とは、指数が0から2047までの符号なし2進整数として表されることを意味します。1023を引くと、実際の符号付き値が得られます。
  • 52ビットの仮数部、これも符号なし2進数であり、先頭に暗黙の「1」が付いた小数値を定義します。
  • 数値の符号を示す符号ビット。

8バイトのメモリに格納されたビットの場合:

バイト0S10倍9倍8倍7倍6個5倍4倍
バイト13倍2倍1個x0m51m50m49m48
バイト2m47m46m45m44m43m42m41m40
バイト3m39m38m37m36m35m34m33m32
バイト4m31m30m29m28m27m26m25m24
バイト5m23m22m21m20m19m18m17m16
バイト6m15m14m13m12m11m10m9m8
バイト7m7m6m5m4立方メートル平方メートルm1m0

ここで、「S」は符号ビット、「x」は指数ビット、「m」は仮数ビットを表します。ここで抽出されたビットは、以下の計算によって変換されます。

<符号> × (1 + <小数点以下>) × 2 <指数> − 1023

この方式では、次の数値の範囲で、約 15 桁の 10 進数までの有効な数値が提供されます。

最大最小
ポジティブ1.797693134862231E+3084.940656458412465E-324
ネガティブ-4.940656458412465E-324-1.797693134862231E+308

この仕様では、定義されていない数値であるNaN (Not A Number)と呼ばれる特別な値もいくつか定義されています。これらはプログラムで無効な演算などを示すために使用されます。

一部のプログラムでは32ビット浮動小数点数も使用されます。最も一般的な方式は、23ビットの仮数部と符号ビット、そして「127超過」形式の8ビット指数部で構成され、7桁の有効な10進数を生成します。

バイト0S7倍6個5倍4倍3倍2倍1個
バイト1x0m22m21m20m19m18m17m16
バイト2m15m14m13m12m11m10m9m8
バイト3m7m6m5m4立方メートル平方メートルm1m0

ビットは次の計算によって数値に変換されます。

<符号> × (1 + <小数点以下>) × 2 <指数> − 127

次の数値の範囲が導き出されます。

最大最小
ポジティブ3.402823E+382.802597E-45
ネガティブ-2.802597E-45-3.402823E+38

このような浮動小数点数は一般に「実数」または「浮動小数点数」と呼ばれますが、いくつかのバリエーションがあります。

32 ビットの float 値は、「単精度浮動小数点値」を意味する「real32」または「single」と呼ばれることもあります。

64 ビット float は、「倍精度浮動小数点値」を意味する「real64」または「double」と呼ばれることもあります。

数値とビットパターンの関係は、コンピュータ操作の利便性を考慮して選択されています。コンピュータメモリに格納される8バイトは、64ビット実数1個、32ビット実数2個、符号付きまたは符号なし整数4個、あるいは8バイトに収まるその他の種類のデータを表すことができます。唯一の違いは、コンピュータがそれらをどのように解釈するかです。コンピュータが4つの符号なし整数を格納し、それをメモリから64ビット実数として読み戻した場合、それはほとんどの場合、完全に有効な実数となりますが、実際にはジャンクデータとなります。

与えられたビット数で表現できる実数は有限の範囲に限られます。算術演算ではオーバーフローやアンダーフローが発生し、表現できないほど大きな値や小さな値が生成されることがあります。

表現精度には限界があります。例えば、64ビット実数では15桁の小数しか表現できません。非常に小さな浮動小数点数を大きな数値に加算すると、結果は大きな数値だけになります。小さな数値は15桁や16桁の解像度では表現できないほど小さいため、コンピューターは事実上それを破棄します。限られた精度の影響を分析することは、十分に研究されている問題です。丸め誤差の大きさの推定と、大規模な計算におけるその影響を制限する方法は、あらゆる大規模計算プロジェクトに不可欠です。精度の限界は範囲の限界とは異なり、指数ではなく仮数部に影響します。

仮数部は2進小数であり、必ずしも小数と完全に一致するとは限りません。多くの場合、2の逆数乗の和は特定の小数と一致しないため、計算結果はわずかにずれます。例えば、小数「0.1」は、無限に繰り返される2進小数、つまり0.000110011に相当します… [6]

プログラミング言語における数字

アセンブリ言語でプログラミングする場合、プログラマーは数値の表現方法を把握しておく必要があります。プロセッサが必要な数学演算をサポートしていない場合、プログラマーは適切なアルゴリズムと命令シーケンスを考案して演算を実行する必要があります。一部のマイクロプロセッサでは、整数乗算でさえソフトウェアで実行する必要があります。

RubyPythonなどの高水準プログラミング言語は、抽象数値を提供します。抽象数値は、有理数大数値複素数などの拡張型になる場合があります。数学演算は、言語の実装によって提供されるライブラリルーチンによって実行されます。ソースコード内の特定の数学記号は、演算子オーバーロードによって、その数値型の表現に適した異なるオブジェクトコードを呼び出すことができます。つまり、符号付き、符号なし、有理数、浮動小数点数、固定小数点数、整数、複素数など、あらゆる数値に対する数学演算は、全く同じ方法で記述されます。

REXXJavaなどの一部の言語では、異なる形式の丸め誤差を提供する 10 進浮動小数点演算が提供されます。

参照

注釈と参考文献

この記事の最初のバージョンは、Greg Goebel の Vectorsite のパブリック ドメインの記事に基づいています。

  1. ^ ジョン・ストークス (2007). 『Inside the machine: an illustration introduction to microprocessors and computer architecture』 No Starch Press. p. 66. ISBN 978-1-59327-104-6
  2. ^ 「バイト定義」 。 2012年4月24日閲覧
  3. ^ 「マイクロプロセッサとCPU(中央処理装置)」. Network Dictionary. 2017年10月3日時点のオリジナルよりアーカイブ。 2012年5月1日閲覧
  4. ^ "nybble definition" . 2012年5月3日閲覧
  5. ^ "Nybble". TechTerms.com . 2012年5月3日閲覧
  6. ^ Goebel, Greg. 「コンピュータ番号形式」. 2013年2月22日時点のオリジナルよりアーカイブ2012年9月10日閲覧。
Retrieved from "https://en.wikipedia.org/w/index.php?title=Computer_number_format&oldid=1301531801"