How to | 数値結果の精度と確度を制御する方法
Mathematica は厳密な数量にも近似数にも使うことができる.Nを使うと,希望の精度や確度で厳密な数量の数値近似を求めることができる.任意精度の近似数を含む計算では,Mathematica は数値の丸め誤差の伝搬を追跡記録する.高精度の数を使うことによって,他の数値システムでは失敗するような場面で正しい結果を得ることができる.
Mathematica は可能な場合は常に厳密な解を与える:
| Out[206]= |  |
Nを使って厳密数の数値近似を求める:
| Out[207]= |  |
Mathematica では,「精度」は事実上,有効桁数を指す.Nの第2引数を使って結果の精度を指定することができる.精度50で結果を得る:
| Out[208]= |  |
「確度」は事実上,小数点以下の正しい桁数を指す.Nの第2引数として
を与え,確度 a で結果を得る.「
」は任意精度を意味する.例えば,10の確度を指定する:
| Out[91]= |  |
PrecisionとAccuracyを使うとどんな数の精度と確度でも求めることができる.Nを使った結果の精度と確度を確かめる:
| Out[29]= |  |
を使って n 桁まで精度が正しいと分かっている数字を直接入力し,
を使って a 桁まで確度が正しいと分かっている数字を直接入力する:
| Out[42]= |  |
Mathematica では厳密数と2つの異なるタイプの近似数を取り扱うことができる.近似数の1つは機械精度数で,これは使用するコンピュータの高速算術用の特別のハードウェアを利用する.もう1つは任意精度数で,これは指定桁数まで正しい数である.
厳密な数量は無限の精度と確度を持つ:
| Out[225]= |  |
10進法で入力された数字は通常機械精度の数字として解釈され,これはMachinePrecisionの精度を持つ:
| Out[106]= |  |
デフォルトでNの結果は機械精度数である:
| Out[148]= |  |
機械精度の数は通常,53ビットに厳密に対応し,16桁より少し小さい桁数を持つ:
| Out[172]= |  |
任意精度の数は
および
を使って入力する.10桁の精度を持つ任意精度数と10桁の確度を持つ同じような数を入力する:
| Out[4]= |  |
| Out[5]= |  |
が精度10を持つと指定することは,その確度に対して特定の値を示唆することで,この場合は10より小さい値である.差分(Precision[x]-Accuracy[x])は事実上数字のスケール,つまり大きさであり,これはRealExponent[x]によって与えられる:
| Out[6]= |  |
が確度10を持つと指定することは,その精度に対して特定の値を意味することで,この場合は10より大きい値である:
| Out[7]= |  |
数の確度は負になることも可能で,その場合正しい既知の数はすべて小数点の左側にあることを示す:
| Out[184]= |  |
MachinePrecisionは他の精度に比べると正確さに欠けると考えられる.これは,機械精度の数は常に16桁より少し小さい桁数を保存するが,その中で特定の桁数が正しいと分かっているわけではないからである.
ここでは,機械精度のすべての桁の数字が正しい(InputFormを使って近似数のゼロではない桁数をすべて表示する):
Out[211]//InputForm= |
| |  |
この場合は,機械精度で表示された場合にほとんど等しい2つの数の引き算であるため,機械精度の桁数の中で正しいものは1つもない:
| Out[205]= |  |
n 桁の正しい数を確実に得るためには,N[expr, n]を使う.10桁の正しい数字を得る:
| Out[207]= |  |
Nはその入力よりも高い精度で結果を出すことはできない.ここではNが100桁の精度で結果を得ることはできない.入力が10桁までしか正確ではないからである:
| Out[241]= |  |
ここではNが6桁の精度で結果を得ることはできない.入力が機械精度数であり,他の精度よりも正確ではないと考えられるからである:
| Out[248]= |  |
近似数 num の精度がPrecision[num]が示す精度より正確であることが分かっている場合には,その精度をSetPrecisionを使って厳密に設定することができる.機械精度数0.5に対応する20桁の精度を持つ任意精度数を得る:
| Out[246]= |  |
式が近似数を含む場合には,通常Nを使う必要はない.Mathematica は自動的に近似の結果を計算し,入力の精度を考慮することで結果の精度を決定する.一般に,結果の精度は入力のどの部分の精度とも異なり得る.
10桁の精度を持つ数を1000桁の精度を持つ数に加える:
| Out[286]= |  |
直前の出力(
)にPrecisionを使って,Mathematica が11桁の精度の結果を決定できたことを確かめる:
| Out[287]= |  |
機械精度の数は他の数に比べると正確ではないとされるので,入力に機械精度の数が含まれる場合には,通常結果は機械精度である.
「
」(Mapの簡略形)を使って,機械精度数を含む計算のリストの各部分にPrecisionを適用する:
| Out[28]= |  |
結果の精度は,入力の最低精度の部分とほとんど異ならないことが多い:
| Out[296]= |  |
| Out[297]= |  |
場合によっては,結果の精度が入力の精度よりもずっと小さくなることがある.この現象は,2つのほとんど等しい近似数の引き算を行ったために起ることが最も多い:
| Out[5]= |  |
| Out[6]= |  |
特定の精度や確度の結果が必要である場合には,通常厳密な入力を与え,Nを使う方がよい.これは,指定を満足する結果を得るために,Nは一時的に要求された精度よりも高い精度で計算することがあるからである.
20桁の精度で
の近似を得る:
| Out[166]= |  |
| Out[167]= |  |