数値の精度
「厳密値と近似値」で触れたが,
Mathematica はどんな桁精度の実数でも扱える.ここで,実数の精度とは一般に有効桁数の大きさを計る.一方,精度に似た尺度に確度という考えがある.実数近似値において確度とは小数点以下の桁数の大きさを計る.つまり,精度は数値の相対誤差の大きさを計り,確度は絶対誤差の大きさを計る.数の扱いが完全に首尾一貫するためには,精度と確度の値が整数桁に対応しないことがしばしばある.
実数の精度と確度
| Out[1]= |  |
|
| Out[2]= |  |
|
何桁かだけが小数点の右側になっているので確度は低い.
| Out[3]= |  |
|
| Out[4]= |  |
|
| Out[5]= |  |
|
近似実数の値には見えない桁に関連する不確かさが常に付きまとう.精度をこの不確かさの相対的な大きさの尺度と考えることもできる.確度はこの不確かさの絶対的な大きさの尺度である.
Mathematica は数
x の不確かさが

であればその真値は
x-
/2から
x+
/2までの大きさ

の区間のどこかにあるように設定されている.確度が
a の近似値の不確かさは
10-aで,精度
p の非ゼロの近似値の不確かさは
x
10-pであると定義される.
不確かさについての精度と確度の定義
不確かさよりも小さな量を足したり引いたりしても目に見える影響は出ない.
| Out[6]= |  |
|
| N[expr,n] | 任意精度の数を使ってexpr をn 桁まで評価する |
| N[expr] | 機械精度の数を使ってexpr を数値的に評価する |
任意精度数と機械精度数による数値計算
Mathematica は「任意精度」数と「機械精度」数,すなわち「機械数」の2種類の近似実数を区別する.任意精度数は何桁でもよく,精度の情報も保っていられる.一方機械数は常に同じ桁数で精度情報も持たない.
これは  を機械数に近似したものである.
| Out[7]= |  |
|
| Out[8]= |  |
|
以下でより詳しく説明するが,機械数は使用しているコンピュータシステムの数値機能を直接使用するものである.結果として,これを使うと計算が速くできることが多い.しかし任意精度数に比べて柔軟性は低く,結果が正しいかどうかの判断に難解な数値解析等が必要なことがある.
機械数
| Out[9]= |  |
|
| Out[10]= |  |
|
近似実数の入力があると,機械精度数としてか,それとも,任意精度数として扱うかを
Mathematica 内部で選択しなければならない.特に指定しない限り,
$MachinePrecisionにある機械精度の桁長より短い桁長で実数を入力したならば,機械精度が使われ,その反対に,より長い桁長で入力したならば,任意精度が使われる.
| 123.4 | 機械精度の数 |
| 123.45678901234567890 | コンピュータシステムによっては任意精度の数として扱われる |
| 123.45678901234567890` | すべてのコンピュータシステムでの機械精度の数 |
| 123.456`200 | 任意精度(この場合は200桁精度)の数 |
| 123.456``200 | 任意精度(この場合は200桁確度)の数 |
| 1.234*^6 | 科学表記法の機械精度の数 (1.234 106) |
| 1.234`200*^6 | 科学表記法の200桁精度の数 |
| 2^^101.111`200 | 200桁精度の2進数 |
| 2^^101.111`200*^6 | 科学表記の2進数 (101.1112 26) |
数の入力形式
計算が終了し答が出力されるとき,読みやすさのため桁長が調整される.こうして出力された答は精度が落ちている可能性があるので,再度入力として使う場合は注意が必要である.求めた答を入力として使いたいときは,入力形を答に作用させ,桁精度調整前の情報が失われていないことを確認する必要がある.
標準出力形を使っている場合,この例にあるように答は6桁になってしまう.
| Out[11]= |  |
|
入力形にすると, Mathematica が現時点で認識している全桁が得られる.
Out[12]//InputForm= |
| |  |
|
| Out[13]= |  |
|
入力形を使うと,現行の桁精度を特別に表示できる.さらに,必ず現行精度で数を再構築できるよう指定した以上の桁精度で答を出力する.
Out[14]//InputForm= |
| |  |
|
Out[15]//InputForm= |
| |  |
|
数の出力形の制御
上記
InputFormや後述の
ToStringと
OpenWrite等の数の表記にかかわる関数において,オプション
NumberMarksのデフォルト設定は
$NumberMarksの値で定められる.したがって,
$NumberMarksを設定し直すことによって
InputFormを使った数の表記方法をすべて変更できる.
以下により, Mathematica はデフォルトで入力形式にナンバーマークを含むようになる.
| Out[16]= |  |
|
常時表示にしたので,機械精度の答にもナンバーマークが付け加えられる.
Out[17]//InputForm= |
| |  |
|
ナンバーマークを禁止しても, InputFormを使うと記号 *^を使った科学表記で答が表示される.
Out[18]//InputForm= |
| |  |
|
数値計算ではときには望んでいる精度以下の結果しか得られないことは避けられないことである.特に,ゼロに非常に近い値が得られたときには,その値をゼロと仮定してよいような場合がある.このときには
Chopを使うとゼロに非常に近い近似値を整数
0で置き換えることができる.
| Chop[expr] | 式expr に含まれる10-10 未満の実数近似値を0に置き換える |
| Chop[expr,dx] | dx 未満の実数近似値を0に置き換える |
ゼロに近い端数の除去
この例の計算をすると虚数部に非常に小さい値が生じる.
| Out[19]= |  |
|
| Out[20]= |  |
|