数値の精度

「厳密値と近似値」で触れたが,Wolfram言語はどんな桁精度の実数でも扱える.ここで,実数の精度とは一般に有効桁数の大きさを計る.一方,精度に似た尺度に確度という考えがある.実数近似値において確度とは小数点以下の桁数の大きさを計る.つまり,精度は数値の相対誤差の大きさを計り,確度は絶対誤差の大きさを計る.数の扱いが完全に首尾一貫するためには,精度と確度の値が整数桁に対応しないことがしばしばある.

Precision[x]x の10進法表記の有効桁数
Accuracy[x]x の10進法表記の小数点以下の有効桁数

実数の精度と確度

30桁精度の数を生成する.
In[1]:=
Click for copyable input
Out[1]=
数の桁精度を調べる.
In[2]:=
Click for copyable input
Out[2]=
何桁かだけが小数点の右側になっているので確度は低い.
In[3]:=
Click for copyable input
Out[3]=
この数は桁すべてが小数点の右側になっている.
In[4]:=
Click for copyable input
Out[4]=
確度が精度よりも大きくなっている.
In[5]:=
Click for copyable input
Out[5]=

近似実数の値には見えない桁に関連する不確かさが常に付きまとう.精度をこの不確かさの相対的な大きさの尺度と考えることもできる.確度はこの不確かさの絶対的な大きさの尺度である.

Wolfram言語は数 の不確かさが であればその真値は から までの大きさ の区間のどこかにあるように設定されている.確度が の近似値の不確かさはで,精度 の非零の近似値の不確かさはであると定義される.

不確かさについての精度と確度の定義

不確かさよりも小さな量を足したり引いたりしても目に見える影響は出ない.
In[6]:=
Click for copyable input
Out[6]=
N[expr,n]任意精度の数を使って exprn 桁まで評価する
N[expr]機械精度の数を使って expr を数値的に評価する

任意精度数と機械精度数による数値計算

Wolfram言語は「任意精度」数と「機械精度」数,すなわち「機械数」の2種類の近似実数を区別する.任意精度数は何桁でもよく,精度の情報も保っていられる.一方機械数は常に同じ桁数で精度情報も持たない.

これは を機械数に近似したものである.
In[7]:=
Click for copyable input
Out[7]=
これは両方とも任意精度数である.
In[8]:=
Click for copyable input
Out[8]=

以下でより詳しく説明するが,機械数は使用しているコンピュータシステムの数値機能を直接使用するものである.結果として,これを使うと計算が速くできることが多い.しかし任意精度数に比べて柔軟性は低く,結果が正しいかどうかの判断に難解な数値解析等が必要なことがある.

MachinePrecision機械数を示す精度指定
$MachinePrecision使用しているコンピュータシステムの機械数で有効な精度
MachineNumberQ[x]x が機械数かどうかの検証

機械数

これは機械数を示す記号MachinePrecisionを返す.
In[9]:=
Click for copyable input
Out[9]=
このコンピュータの機械数は16桁より若干劣る.
In[10]:=
Click for copyable input
Out[10]=

近似実数の入力があると,機械精度数としてか,それとも,任意精度数として扱うかをWolfram言語内部で選択しなければならない.特に指定しない限り,$MachinePrecisionにある機械精度の桁長より短い桁長で実数を入力したならば,機械精度が使われ,その反対に,より長い桁長で入力したならば,任意精度が使われる.

123.4 機械精度の数
123.45678901234567890 コンピュータシステムによっては任意精度の数として扱われる
123.45678901234567890` すべてのコンピュータシステムでの機械精度の数
123.456`200 任意精度(この場合は200桁精度)の数
123.456``200 任意精度(この場合は200桁確度)の数
1.234*^6 科学表記法の機械精度の数 (1.234x10^(6))
1.234`200*^6 科学表記法の200桁精度の数
2^^101.111`200 200桁精度の2進数
2^^101.111`200*^6 科学表記の2進数 (101.111_2x2^(6))

数の入力形式

計算が終了し答が出力されるとき,読みやすさのため桁長が調整される.こうして出力された答は精度が落ちている可能性があるので,再度入力として使う場合は注意が必要である.求めた答を入力として使いたいときは,入力形を答に作用させ,桁精度調整前の情報が失われていないことを確認する必要がある.

標準出力形を使っている場合,この例にあるように答は6桁になってしまう.
In[11]:=
Click for copyable input
Out[11]=
入力形にすると,Wolfram言語が現時点で認識している全桁が得られる.
In[12]:=
Click for copyable input
Out[12]//InputForm=
任意精度の数を標準出力形で出力する.
In[13]:=
Click for copyable input
Out[13]=
入力形を使うと,現行の桁精度を特別に表示できる.さらに,必ず現行精度で数を再構築できるよう指定した以上の桁精度で答を出力する.
In[14]:=
Click for copyable input
Out[14]//InputForm=
こうすると桁長の表示はされない.
In[15]:=
Click for copyable input
Out[15]//InputForm=
InputForm[expr,NumberMarks->True]有限精度の実数末尾にナンバーマーク( )を付け数値の桁長を明示する
InputForm[expr,NumberMarks->Automatic]任意精度の数のみにナンバーマーク()による桁長表示を行う
InputForm[expr,NumberMarks->False]ナンバーマーク()桁長表示を禁止する

数の出力形の制御

上記InputFormや後述のToStringOpenWrite等の数の表記にかかわる関数において,オプションNumberMarksのデフォルト設定は$NumberMarksの値で定められる.したがって,$NumberMarksを設定し直すことによってInputFormを使った数の表記方法をすべて変更できる.

以下により,Wolfram言語はデフォルトで入力形式にナンバーマークを含むようになる.
In[16]:=
Click for copyable input
Out[16]=
常時表示にしたので,機械精度の答にもナンバーマークが付け加えられる.
In[17]:=
Click for copyable input
Out[17]//InputForm=
ナンバーマークを禁止しても,InputFormを使うと記号を使った科学表記で答が表示される.
In[18]:=
Click for copyable input
Out[18]//InputForm=

数値計算ではときには望んでいる精度以下の結果しか得られないことは避けられないことである.特に,ゼロに非常に近い値が得られたときには,その値をゼロと仮定してよいような場合がある.このときにはChopを使うとゼロに非常に近い近似値を整数0で置き換えることができる.

Chop[expr]expr に含まれる10^(-10)未満の実数近似値を0に置き換える
Chop[expr,dx]dx 未満の実数近似値を0に置き換える

ゼロに近い端数の除去

この例の計算をすると虚数部に非常に小さい値が生じる.
In[19]:=
Click for copyable input
Out[19]=
Chopを作用させ答から虚数部を除去する.
In[20]:=
Click for copyable input
Out[20]=