コンピュータ内部では電気信号の有無を0と1に割り当て2進法で数値を表現する。
符号付整数型 (signed integer type) は最上位ビット (most significant bit, MSB) を符号ビットに割り当て、0ならば値が0か正、1ならば値が負であることを表す。 他のビットは仮数部と呼ばれ、正の数であれば数値を、負の数であれば数値の絶対値を2の補数 (後述) で表すのが一般的である。
2の補数 (2's complement) は負の値を表現する方法の1つであり、元の値のすべてのビットを反転したものに1を加算した数値である。
前述の符号ビットと組み合わせると、負の数を含む加算 (と減算) を同じ加算器で扱うことができる。
整数型は一般的に16ビット (short
), 32ビット (int
), 64ビット (long
, long long
) のいずれかで表される。
整数型のビット数は実装に依存することもある。 例えば、C/C++の long
やRust の
usize
のビット数は実装 (プラットフォーム) 依存である。
整数型のビット数を とすると、表現可能な数値 の範囲は となる。 ただし、符号付整数型ではMSBが符号ビットになるため、表現可能な数値 の範囲は となる。
演算結果が格納域の記録できる範囲を超えてしまうと、最上位桁より上への繰り上がり (キャリー) が失われたり、本来演算結果を格納する場所とは違うビット (符号ビットなど) に格納される場合がある。 この現象を (算術)オーバーフロー (overflow) という。
浮動小数点数型では以下に示す情報で数値を表現する。
数値の絶対値は以下の式で表される。
IEEE標準のひとつであるIEEE 754 (IEEE Standard for Floating-Point Arithmetic) で定められている浮動小数点数の方式を以下に示す。
方式 | 符号ビット | 指数部の長さ (bits) | 仮数部の長さ (bits) | 指数部のゲタ |
---|---|---|---|---|
半精度浮動小数点数 | 1 ビット | 5 | 10 | 15 |
単精度浮動小数点数 (float) | 1 ビット | 8 | 23 | 127 |
倍精度浮動小数点数 (double) | 1 ビット | 11 | 52 | 1023 |
反復計算において、必要とされる回数より少ない回数で反復を止める (打ち切り) によって生じる誤差。
精度が限られている条件下で、絶対値の大きい数と絶対値の小さい数を加減算したときに、絶対値の小さい数が無視されてしまう現象。
値がほぼ等しく、丸め誤差をもつ数値同士の減算したときに、有効数字が減る現象。
数値計算の誤差によって引き起こされた事故として
などが挙げられる。
ここで、 のときの を計算する。
Rumpの例題はこのように
ある演算精度での計算結果とそれより高い演算精度での計算結果を比較したときに、双方の値が近ければ、その値はある程度は正しい。
という直感に対する反例である。
精度保証付き数値計算とは、数学的で厳密な誤差の評価を伴う数値計算のことをいう。
任意精度演算とは、数値の精度に限りがない演算システム (またはデータ構造) のことをいう。
有名な任意精度演算をサポートするデータ構造として、Javaの BigInteger
(整数), BigDecimal
(小数点数) などがある。