機械精度の数値

計算式にひとつでも機械精度の数があると,その式のすべての計算は機械精度で行われ,答は機械精度で出てくる.

1つでも機械精度の入力数値があると,すべて機械精度で計算される.
In[1]:=
Click for copyable input
Out[1]=
Zeta[5.6]は機械精度の値を返すので,Nがこの場合あってもなくても答は機械精度の数値で出てくる.
In[2]:=
Click for copyable input
Out[2]=
今度は,高い精度で答を得ることができる.
In[3]:=
Click for copyable input
Out[3]=

任意精度の数を用いて計算するとき,「任意精度の数」で説明してあるように,Wolfram言語内部で常に計算結果の桁精度がどのステップでいくつあるか監視される.そして,入力値の精度に応じて,正確に判明している桁だけが答として出力される.しかし,機械精度の数で計算をする場合は事情が違ってくる.つまり,入力値の精度に基づいて計算結果の全桁が決定できたとしてもWolfram言語は常に機械精度の桁数でしか答を出さない.

機械精度を持った2つの数の差を取る.
In[4]:=
Click for copyable input
Out[4]=
桁精度を確認してみると,機械精度になっている.
In[5]:=
Click for copyable input
Out[5]=
実際に確定した桁をすべて表示する.
In[6]:=
Click for copyable input
Out[6]//InputForm=

Wolfram言語で機械精度の数値計算をすると,ちぐはぐな桁が発生するという事実は望ましいことではない.しかし,固定桁精度を使う最大の理由は計算効率を高めるということにある.

ユーザがコンピュータシステムの詳細を調べる必要がないようにWolfram言語は設定されている.とはいっても,もし,Wolfram言語がコンピュータの持つ実数演算機能を最大限に利用していないと,機械精度の数を扱った計算で大きな損失が出てしまう.

ほとんどのコンピュータは特定の固定桁精度で浮動点数値計算を実行するための特殊なハードウェア,または,マイクロコードを備えていている.機械精度で数値計算をする際に,それらの機能をWolfram言語は最大限利用する.

Wolfram言語の動作するコンピュータでは,Wolfram言語において機械精度とされる数値は,倍精度の浮動点数値として表される.現在使われているほとんどのコンピュータでは,倍精度の数は64ビットの情報量を持っており,10進法で16桁の仮数部からなる.

コンピュータに組み込まれた浮動点機能を使う最大の理由はスピードである.そのような機能を直接使わない任意精度の数値計算は普通,機械精度の計算に比べ何倍も遅い.

組込み演算機能を使うと悪い点もある.すでに説明したが,そのひとつは,適切な桁精度が別にあっても,計算に使うすべての数が固定桁精度に強制されることである.

2つ目の悪い点は,コンピュータが違えば機械精度の数は違った扱いを受ける可能性があることである.機械精度の数を使うとき,Wolfram言語はコンピュータの演算システムの言いなりにならざるを得ない.もし,浮動点の演算処理を違った方法で行うコンピュータを使ったなら,Wolfram言語で行う機械精度の計算は微妙に違った結果が得られることもある.

$MachinePrecision10進法表記の桁精度の桁長
$MachineEpsilon1.0に加えて得られる値が1.0に等しくなくなる最小の機械精度の正の数
$MaxMachineNumber機械精度の最大値
$MinMachineNumber機械精度の正の最小値
$MaxNumber任意精度の数の取り得る最大値
$MinNumber任意精度の正の数の最小値

あるコンピュータシステムにおける数の特徴

コンピュータシステムが何であれ,機械精度の数は特定の2進ビットの固定数で表される.このため,非常に近い値を持った数が2つあると,両者は全く同じビットパターンを持ってしまい,区別ができなくなる.使っているコンピュータで,の値に最も近似で,かつ,異なった2進表記の数が何かを調べることができる.両者の値の差がパラメータ$MachineEpsilonに割り付けられているので,このパラメータを参照すればよい.

この本の例題の計算に使っているコンピュータシステムの$MachineEpsilonの値を確認する.
In[7]:=
Click for copyable input
Out[7]=
返ってくる精度値はであるが,Wolfram言語は実際の値がそれより大きいことを知っている.
In[8]:=
Click for copyable input
Out[8]=
InputFormを使うと結果が厳密な1ではないことが分かる.
In[9]:=
Click for copyable input
Out[9]//InputForm=
1を引き,$MachineEpsilonを得る.
In[10]:=
Click for copyable input
Out[10]=
これもまたの答が返ってくる.
In[11]:=
Click for copyable input
Out[11]=
この場合は,機械精度で結果はとはっきり区別できない.
In[12]:=
Click for copyable input
Out[12]//InputForm=
結果から1を引くと0が返される.
In[13]:=
Click for copyable input
Out[13]=

機械数は限定した桁精度しか持たないだけでなく,大きさも限定される.$MinMachineNumber$MaxMachineNumberで指定される区間の外に存在する数が必要な場合は,Wolfram言語内部で自動的にその数が任意精度に変換される.

この例で使ったコンピュータシステムの扱える機械精度で表せる最大値を参照する.
In[14]:=
Click for copyable input
Out[14]=
Wolfram言語は$MaxMachineNumberより大きな結果を自動的に任意精度に変換する.
In[15]:=
Click for copyable input
Out[15]=
次の計算では結果が機械精度数の範囲外になっている.
In[16]:=
Click for copyable input
Out[16]=