任意精度の数
計算が任意精度を持つ数に基づいて行われるとき,精度管理が全計算過程において取られる.そうすることで,入力値の精度に基づく最高精度で答が通常求まる.
Mathematica 内部では,任意精度の数には有効な桁長は任意で限られた数しかなく,他の桁は未知である,とされる.一般に,任意精度の数 x は確定している有効数字(Precision[x]の返す桁数)とそれに続く全く不確定な無限桁長の数字からなるものとして扱われる.
これは

を10桁精度で計算する.
| Out[1]= |  |
| Out[2]= |  |
式が入力され計算が始まると,計算結果のどの数字が入力値の持つ不確定な数字に影響されるか検討がなされる.そして影響を受けた数字が含まれないように精度が設定される.その結果,不確定な数字がどんな値であろうと,Mathematica が出力する数字はすべて正しいものであることが保証される.

を30桁精度で計算する.
| Out[3]= |  |
| Out[4]= |  |
数桁精度の値を入力すると,答の精度が落ちていることが分かる.
| Out[5]= |  |
引数が近似値でなく厳密な値

であるならば,これをはっきりしなければいけない.
| Out[6]= |  |
多くの計算問題で「丸め誤差」や「桁落ち誤差」が原因となり,計算ステップが重なるにつれ答の精度が次第に落ちてしまうことがある.このうち「桁落ち誤差」はほとんど同じ値を持った2つの数の差を取るときによく起る.接近した2数の差はその有効数字のうち末尾の方だけによって定まるが,一般的に,差を取る前の数に比べ答の有効数字の桁は非常に少なくなってしまう.
両入力値とも有効数字は20ある.しかし,答の精度はずっと低くなる.
| Out[7]= |  |
差を取る片方の数だけ桁精度を上げても,答の精度は上がらない.
| Out[8]= |  |
関数の出力精度は引数の持つ精度(入力精度)に複雑な形で依存する.変化の激しい挙動を持つ関数は一般に出力精度が劣る.なぜかというと,同じ誤差を持つ引数を入力したら,変化の小さい関数に比べ,関数値により大きな出力変動幅が出てしまうからである.これに対して,定数関数に近い関数は入力精度より高い精度で関数値を返すときがある.
| Out[9]= |  |

の値を20桁精度で計算する.
| Out[10]= |  |
厳密な整数値

を加えると答がより高い精度を持つようになる.
| Out[11]= |  |
一般に,同じ計算をいくつかの違う方法で行うと,精度が違った答が得られてしまうことを認識しておく必要がある.桁精度は1度失ったら取り戻せない.これは情報を失うことである.
| Out[12]= |  |
整数値

を加算しても桁精度は落ちない.
| Out[13]= |  |
| Out[14]= |  |
この例の式は,実は,

の値と同じ計算をするが,この式を使うと精度が落ちてしまう.
| Out[15]= |  |
| Out[16]= |  |
上の例にもあったように,同じ計算をしても演算法を変えると違った近似値が答として求まってしまうときがある.このことから,2つの近接値の比較をするときは十分な注意を払う必要があると言える.Mathematica が2つの実数が等しいかどうかを判定するときは実効的な差を取る.そして,差が入力精度的に許容される幅の中にあるかどうか判定する.許容幅に収まる場合は「ゼロに一致」と解釈する.
| Out[17]= |  |
数学関数の計算に使う Mathematica の内部アルゴリズムは,答の精度をなるべく高く保つように作られている.Mathematica の組込み関数を使っている限り,通常,入力精度に対応する最高の精度で答が得られる.しかし場合によっては期待するほど高い精度で答は返ってこない.これは,内部処理的に高い精度で処理を続けることが不可能になり,Mathematica が計算精度を下げて処理したため起ってしまう.もちろん,引数の有効数字を増やし,入力精度を上げておけば,Mathematica の内部処理がより高い精度で実行できるため,多くの場合,答の精度もそれにつられて高くなる.
| N[expr] | 式 expr を数値解析的に計算し機械精度で答を出力する |
| N[expr,n] | 式 expr を数値解析的に計算し最高 n 桁精度で答を出力する |
数値計算と桁精度
整数とその他の厳密数値要素のみで構成される式が第1の入力式であれば,N[expr, n]を使い,ほとんどの場合,指定通り n 桁精度で答を得られるであろう.ここで注意してほしいのは,高い桁精度で答を出すということは,ときには,内部の中間計算はそれ以上の精度で行われなければならない,ということである.
この中間処理で許容する補助的な有効数字を指定・変更するには,大域パラメータである$MaxExtraPrecisionの値を変えればよい.
中間計算の精度管理
Mathematica は正しい答を得るために自動的に内部精度を上げる.
| Out[18]= |  |
| Out[19]= |  |
このようにして
Mathematica に,内部計算でもっと桁数を使ってもよいと指示する.
| Out[20]= |  |
| Out[21]= |  |
| Out[22]= |  |
計算に厳密な数を使っていても,内容によっては内部処理の一部で近似値が使われることがある.このため,$MaxExtraPrecisionの設定値によっては,厳密な値を使っていても精度の低下が起る場合がある.
| Out[23]= |  |
| Out[24]= |  |
| Out[25]= |  |
精度を低下させる計算をすると,結果の数に有効桁が全くない可能性もある.しかし,そのような場合でもなお,Mathematica はその数の確度に関する情報を保っている.有効数字はないが確度が a である数を与えられると,Mathematica はその数の実際の値が範囲
にあることが示せる.Mathematica はデフォルトによりそのような数を
という形で出力する.
| Out[26]= |  |
| Out[27]= |  |
それでも
Mathematica は結果の確度を記録している.
| Out[28]= |  |
この結果を厳密な

に加えるとかなり高精度の数が与えられる.
| Out[29]= |  |
数をその精度で特徴付ける難しさは,ゼロと一致する数ならどれでも精度がゼロであるとして扱われる点である.そのような数の既知の桁はすべてゼロなので有効であるとみなし得る桁がないというのがその理由である.
| Out[30]= |  |
| Out[31]= |  |
しかし,この数にはこの数の不確かさを特徴付ける確かな確度がある.
| Out[32]= |  |
結果がゼロ付近になりそうな計算をするときは所望の精度ではなく確度を指定した方がよいかもしれない.
| N[expr,p] | 精度 p で expr を評価する |
| N[expr,{p,a}] | 最高精度 p, 確度 a で expr を評価する |
| N[expr,{Infinity,a}] | 任意精度,確度 a で expr を評価する |
確度と精度の指定
| Out[33]= |  |
| Out[34]= |  |
| Out[35]= |  |
| Out[36]= |  |
任意精度の数に現れる不確定数字を扱うときに,Mathematica は異なる2数の不確定数字は互いに完全に独立であると仮定する.その理由は追って説明するが,そうしておけば,答の精度が不正に高くなるというようなことは起らなくなる.しかし,同時に,不必要に精度を下げてしまうこともある.
特に,ある計算で2つの数が同じ処理で生成される場合には,不確定桁のうちのいくつかが同じ値を持つ可能性がある.そして,差を取ると,不確定桁が実際には消えてしまうという場合も起り得る.ところが,Mathematica では,不確定桁は常に独立しているという前提を取っているので,本来なら行われるべきキャンセル処理をしないという可能性もある.
| Out[37]= |  |

の計算値はおよそ34桁精度である.
| Out[38]= |  |
この値では精度が劣る.各々の入力変数

の持つ不確定桁は独立であるという前提で計算処理を進めたからである.
| Out[39]= |  |
数値計算アルゴリズムは,場合によっては,式中の数と数で不確定桁がキャンセルすることで答の精度を上げている.もし不確定桁がいずれキャンセルする,ということが事前に分かっているならキャンセルする不確定桁の代りに固定桁を追加しておくとよい.計算で確定桁がキャンセルすることによって,桁精度の向上した答が得られる.
精度と確度を変更する関数

に桁10個を付け足す.
| Out[40]= |  |
| Out[41]= |  |
| Out[42]= |  |
SetPrecisionは2進値ゼロの桁を必要数付け足すことで数の精度を上げる.ただし,計算によっては,Mathematica が表示する桁数より多い桁を任意数導入するようになっている.そのようなときは,SetPrecisionではゼロの桁を追加する前に Mathematica が入れた桁を使う.
40桁精度の実数を作る.任意に付け足す桁は2進値ゼロとして導入される.
| Out[43]= |  |
大域精度管理パラメータ
$MinPrecision=n と大域定義をすることで,実効的に,SetPrecision[expr, n]で行う任意精度の設定を計算するすべてのステップに適応することができる.これは,n 桁以下の有効数字を持つ任意精度の数には,全桁数が常に n になるようゼロ桁が自動的に付け足される,ということを意味している.
$MaxPrecision=n と$MinPrecision=n の両方を設定しておくと,任意精度の数ならどんな数でも n 桁長の固定精度を持つように強制することができる.つまり,Mathematica に,任意精度の数を機械精度の数と同じように扱うように指示することになる.もちろん,通常の機械精度より桁精度を上げてだ.
固定桁精度にすると,計算処理によっては効率が上がることがある.しかし,注意深い分析をしないと,答が出てもどの桁までが実際に正しいのか不明である.
| Out[44]= |  |
| Out[45]= |  |
| Out[46]= |  |
| Out[47]= |  |