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

あるコンピュータシステムにおける数の特徴
コンピュータシステムが何であれ,機械精度の数は特定の2進ビットの固定数で表される.このため,非常に近い値を持った数が2つあると,両者は全く同じビットパターンを持ってしまい,区別ができなくなる.使っているコンピュータで, 1.0の値に最も近似で,かつ,異なった2進表記の数が何かを調べることができる.両者の値の差がパラメータ $MachineEpsilonに割り付けられているので,このパラメータを参照すればよい.
この本の例題の計算に使っているコンピュータシステムの $MachineEpsilonの値を確認する.
In[7]:= $MachineEpsilon
Out[7]= 
返ってくる精度値は 1.であるが,Mathematicaは実際の値がそれより大きいことを知っている.
In[8]:= 1. + $MachineEpsilon
Out[8]= 
1を引き, $MachineEpsilonを得る.
In[9]:= % - 1.
Out[9]= 
これもまた 1.の答が返ってくる.
In[10]:= 1. + $MachineEpsilon/2
Out[10]= 
今度は1を引くと答は0が返ってくる.機械精度では,1+$MachineEpsilon/2は1.から区別できないからである.
In[11]:= % - 1.
Out[11]= 
機械数は限定した桁精度しか持たないだけでなく,大きさも限定される. $MinMachineNumberと $MaxMachineNumberで指定される区間の外に存在する数が必要な場合は, Mathematica内部で自動的にその数が任意精度に変換される.
この例で使ったコンピュータシステムの扱える機械精度で表せる最大値を参照する.
In[12]:= $MaxMachineNumber
Out[12]= 
この例の計算値は自動的に任意精度に変換される.
In[13]:= Exp[1000.]
Out[13]= 
|