機械精度の数値
計算式にひとつでも機械精度の数があると,その式のすべての計算は機械精度で行われ,答は機械精度で出てくる.
1つでも機械精度の入力数値があると,すべて機械精度で計算される.
| Out[1]= |  |
Zeta[5.6]は機械精度の値を返すので,
Nがこの場合あってもなくても答は機械精度の数値で出てくる.
| Out[2]= |  |
| Out[3]= |  |
任意精度の数を用いて計算するとき,「任意精度の数」で説明してあるように,Mathematica 内部で常に計算結果の桁精度がどのステップでいくつあるか監視される.そして,入力値の精度に応じて,正確に判明している桁だけが答として出力される.しかし,機械精度の数で計算をする場合は事情が違ってくる.つまり,入力値の精度に基づいて計算結果の全桁が決定できたとしても Mathematica は常に機械精度の桁数でしか答を出さない.
| Out[4]= |  |
| Out[5]= |  |
Out[6]//InputForm= |
| |  |
Mathematica で機械精度の数値計算をすると,ちぐはぐな桁が発生するという事実は望ましいことではない.しかし,固定桁精度を使う最大の理由は計算効率を高めるということにある.
ユーザがコンピュータシステムの詳細を調べる必要がないように Mathematica は設定されている.とはいっても,もし,Mathematica がコンピュータの持つ実数演算機能を最大限に利用していないと,機械精度の数を扱った計算で大きな損失が出てしまう.
ほとんどのコンピュータは特定の固定桁精度で浮動点数値計算を実行するための特殊なハードウェア,または,マイクロコードを備えていている.機械精度で数値計算をする際に,それらの機能を Mathematica は最大限利用する.
Mathematica の動作するコンピュータでは,Mathematica において機械精度とされる数値は,倍精度の浮動点数値として表される.現在使われているほとんどのコンピュータでは,倍精度の数は64ビットの情報量を持っており,10進法で16桁の仮数部からなる.
コンピュータに組み込まれた浮動点機能を使う最大の理由はスピードである.そのような機能を直接使わない任意精度の数値計算は普通,機械精度の計算に比べ何倍も遅い.
組込み演算機能を使うと悪い点もある.すでに説明したが,そのひとつは,適切な桁精度が別にあっても,計算に使うすべての数が固定桁精度に強制されることである.
2つ目の悪い点は,コンピュータが違えば機械精度の数は違った扱いを受ける可能性があることである.機械精度の数を使うとき,Mathematica はコンピュータの演算システムの言いなりにならざるを得ない.もし,浮動点の演算処理を違った方法で行うコンピュータを使ったなら,Mathematica で行う機械精度の計算は微妙に違った結果が得られることもある.
あるコンピュータシステムにおける数の特徴
コンピュータシステムが何であれ,機械精度の数は特定の2進ビットの固定数で表される.このため,非常に近い値を持った数が2つあると,両者は全く同じビットパターンを持ってしまい,区別ができなくなる.使っているコンピュータで,
の値に最も近似で,かつ,異なった2進表記の数が何かを調べることができる.両者の値の差がパラメータ$MachineEpsilonに割り付けられているので,このパラメータを参照すればよい.
| Out[7]= |  |
返ってくる精度値は

であるが,
Mathematica は実際の値がそれより大きいことを知っている.
| Out[8]= |  |
Out[9]//InputForm= |
| |  |
| Out[10]= |  |
これもまた

の答が返ってくる.
| Out[11]= |  |
この場合は,機械精度で結果は

とはっきり区別できない.
Out[12]//InputForm= |
| |  |
| Out[13]= |  |
機械数は限定した桁精度しか持たないだけでなく,大きさも限定される.$MinMachineNumberと$MaxMachineNumberで指定される区間の外に存在する数が必要な場合は,Mathematica 内部で自動的にその数が任意精度に変換される.
この例で使ったコンピュータシステムの扱える機械精度で表せる最大値を参照する.
| Out[14]= |  |
| Out[15]= |  |
次の計算では結果が機械精度数の範囲外になっている.
| Out[16]= |  |