まずは数そのものについての認識。学校で教わった数学では概ねこう定義されて来たはずです。
①自然数(Natural number)
正の整数 1,2,3,… のことである。0や負の整数 -1,-2,…は含まれない。
*大学以降の集合論などにおいては「0も自然数に含まれる」という流儀もありますが、少なくとも中学・高校数学においては「0は自然数に含まれない」でOK。
②整数(Integer)
「0」と、0に1ずつ加えていって得られる「1,2,3,…」と、0から1ずつ引いていって得られる「-1,-2,-3,…」の総称。
③有理数(Rational Number) / ④無理数(Irrational number) / ⑤実数(Real number)
「有理数(Rational Number)」とは「整数の比で表される数」より正確には「2つの整数 a , b を使って a/b と表せる数」を指す。
- 整数は全て「5=5/1」のように「整数の比」で表せる。
- 有限小数(0.173のように小数点以下の桁数が有限の小数)も「0.173=173/1000」の様にすべて「整数の比」で表せる。
- 循環小数(1/7=0.142857142857142…のように同じ数字の列が無限に繰り返される小数)も「0.333…=1/3」といった形ですべて「整数の比」で表せる。
「無理数(Irrational number)」とは逆に「整数の比で表せず、すなわち循環することなく無限に続く小数」を指す。
これに対し「扱うデータを(処理上、必要にして十分なだけの)特定データ長に納める(有効桁で丸める)」事が歴史上重要な意味を持ったコンピューター言語の世界における数字概念は以下となっています。
①符号付き整数型(signed integer type)…整数を格納するデータ型の一種で、0と正の数以外に負の数も表現できる整数型。10進数表記では8ビットの符号付き整数型の値の範囲は-128~127、16ビットでは-32,768~32,767、32ビットでは-2,147,483,648~2,147,483,647となる。コンピュータ言語の世界ではしばしばこれを「int型」と呼ぶ。
- 処理系によっては32ビットや64ビットの符号付き整数型を「符号付き長整数型(signed long integerあるいはsigned long)」と呼ぶこともある。
- これに対し、符号を表現する仕組みがなく0と正の数のみを扱うことができる整数型は「符号なし整数型(unsigned integer type)」と呼ばれる。符号付き整数型は正の数とほぼ同じ絶対値の範囲だけ負の数を表現することができる代わりに、表現できる値の最大値が符号なし整数型のほぼ半分となる。
②浮動小数点型…単なる10進数/2進数表記ではなく「符号部」「指数部」「仮数部」の3セクションで構成された指数表記が用いられる。
10進数表記の例
12345678900000000000000000000 = 1.23456789 * 10^28
*ここでは「1.23456789 」が仮数部、「28」が指数部
0.00000000000000000000123456789 = 1.23456789 * 10^-21
*ここでは「1.23456789 」が仮数部、「-21」が指数部2進数表記の例
110110100100000000000000000000000 = 1.101101001 * 2^32
*ここでは「1.101101001」が仮数部、「32」が指数部
0.00000000000000000000000001101101001 = 1.101101001 * 2^-26
*ここでは「1.101101001」が仮数部、「-26」が指数部非常に大きな実数値や非常に小さな実数値も扱う事がある科学計算の世界が編み出してきた約束事…
- float型…サイズ長は4バイト(32bit)。これを符号部1bit,指数部8bit,仮数部23bitに割り振る事で2進数にして 24 (=23+1) 桁、10進数にして約 7 桁の精度(有効桁数)を確保。指数部も有限であるため、この形式で表現可能な実数の絶対値は最大「1.175494*10^-38」、最小「3.402823*10^+38」となる。
*このfloat型の下限値と上限値について、例えばC言語のヘッダファイル float.h では「FLT_MIN = 1.175494e-38, FLT_MAX = 3.402823e+38」と定義されている。 - double型…サイズ長は8バイト(64bit)。これを符号部1bit,指数部11bit,仮数部52bitに割り振る事で2進数にして24 (=23+1) 桁、10進数にして約15 桁の精度(有効桁数)を確保。指数部も有限であるため、この形式で表現可能な実数の絶対値は最大「2.225074*10^-308」、最小「1.797693*10^+308」となる。
*このdouble型の下限値と上限値について、例えばC言語のヘッダファイル float.h では「DBL_MIN = 2.225074e-308, DBL_MAX = 1.797693e+308」と定義されている。
こうしたコンピューター言語独特の特性が、以下の様な状況を引き起こすのです。
- 現在のほとんどのコンピュータには double 型のデータを専門に扱う回路が付いている上、現在のコンピュータは十分なメモリを持っているので「メモリサイズが double 型の半分」という float 型の利点が有効となるケースがほとんどない。それどころかfloat 型の計算を行うときには,一度 double 型に変換した後,この回路で計算し, その後再び float 型に変換されるのでかえって時間が多く掛かってしまう。
- 異なるデータ型を用いた計算時は自動調整(型変換)がなされるが、言語によっては①ただの文字列(Char型)がint型に変換される(例えば小数点を読み落とす)。②int型同士の計算はint型に格納される(例えば1を3で割った結果が0.3333…ではなく0になる)③int型は(整数部分だけに限ると)10桁ほどの精度があるが, float型は7桁ほどしかないので計算次第では桁落ちが発生する、といった問題が発生する。
- 浮動小数点数型同士の計算時も「計算過程での桁落ち(計算途中で桁あふれが生じてもコンピューターはそれを教えてくれない)」や「情報落ち(絶対値が大きな値と小さな値を加えた場合,小さい方の数値がもつ情報が失われる)」といった「丸め誤差」問題が発生する。
こうして全体像を俯瞰してみると、コンピューターの世界には歴史的に「(固有の数理モデル操作に伴う)誤差の放逐」なる独自の、しかしとにかく「(貧弱な処理能力を補う為の)処理効率向上」と並ぶ最大級の「集-立(Gestell)システム(後期ハイデガーいうところの「特定意図達成の為に手持ちリソースを総動員しようとする体制」)的課題に直面させられてきた事が彷彿とさせられますね。「無理数と有理数を識別する能力」などは、現代社会においてすら後回しという…