Wolfram言語がサポートするコンピュータ演算のタイプ
Wolfram言語は以下の3つのタイプのコンピュータ演算をサポートします.
どのタイプも利点と欠点があるため,速く正確な結果を得るためにいつどれを使うかを理解することがWolfram言語プログラマーのツールボックスの重要な部分になります.この記事は,技術的な詳細には踏み込まずにそれぞれのタイプの概要を紹介することを目的としています.詳細はこの記事からリンクされているWolfram言語のドキュメントをご覧ください.
機械精度演算
機械精度演算が使われるのは,小数点の付いた数値(4.2や1.等)が入力されたとき,あるいはN関数が単独の引数で使われた(N[1/2]等)ときです.ほとんどの新しいコンピュータでは,機械精度演算は仮数(小数点以下の桁)が約16桁の結果を返します.
機械精度演算を使う主な利点はその速さです.任意精度の計算は通常機械精度の計算よりも何倍も遅くなります.
機械精度の計算は速いですが,正確さが重要な非常に大きいあるいは非常に小さい数を扱う場合や記号的な結果が要求されている場合は避けなければなりません.そのような場合はそれぞれ任意精度,無限精度を使います.
機械精度を使うときは,丸め誤差が追跡されないということも注意する必要があります.高速にするためにそうなっているのですが,誤った結果となる可能性があります.例えば,以下ではOut[1]は正しくありません.
In[1]:= N[Sin[10^50]]
Out[1]= -0.4805
In[2]:= N[Sin[10^50], 20]
Out[2]= -0.78967249342931008271
Wolfram言語の組込み数学関数のほとんどは,与えられた入力の精度に最もマッチする出力を提供します.これらの関数に機械精度の入力を与えると,機械精度の出力になります.以下はその例です.
In[3]:= Sin[4.2]
Out[3]= -0.871576
In[4]:= Precision[%]
Out[4]= MachinePrecision
同様に,1つの計算の中で機械精度の入力と任意精度あるいは無限精度の入力を組み合せると,結果は機械精度で与えられます.
In[5]:= 3 + 4.5
Out[5]= 7.5
In[6]:= Precision@%
Out[6]= MachinePrecision
数値計算演算子(NIntegrate,NSum,NDSolve等)はデフォルトでは機械精度を返します.
任意精度演算
任意精度演算数で計算を行う場合,Wolfram言語は常に精度を追跡します.通常Wolfram言語は,入力の精度に基づいて,可能な限り最高の精度で結果を返そうとします.
任意精度数は最も一般的には,第2引数を持つN関数を使うことで生成されます.例えばN[Pi, 20]はPiの数値結果を20桁精度まで与えます(3.1415926535897932385).
任意精度は非常に大きいあるいは小さい数を含む,高精度を要求する計算に便利です.しかし,任意精度の計算は機械精度の計算よりも遅いため,高精度が要求されていない場合は任意精度数は使われません.
機械精度数でもそうであるように,組込みの数学関数に任意精度入力を使うと,その結果は任意精度の出力になります.以下がその例です.
In[1]:= N[7, 30]^2
Out[1]= 49.0000000000000000000000000000
In[2]:= Precision[%]
Out[2]= 29.699
機械精度と任意精度の入力を組み合せると機械精度の出力になります.その結果誤差は追跡されません.
任意精度の式を評価する効率的な方法に,SetPrecisionを使うというものがあります.
In[3]:= SetPrecision[1.9658*(1.23423423/500 + 600/3.9879), 20]
Out[3]= 295.76954069704845551
数値計算演算子(NIntegrate,NSum,NDSolve等)のWorkingPrecisionオプションを設定すると,これらの演算子が任意精度を使うよう強制することができます.
無限精度演算
無限精度演算は,厳密な入力が既知であり厳密な出力が所望される場合や,代数的に式を操作する場合に使われます.
Rationalizeは浮動小数点数を厳密数に変換する便利な関数です.
組込みの数学関数に無限精度の入力を与えると,結果は無限精度の出力になります.以下がその例です.
In[1]:= Cos[Pi]
Out[1]= -1
In[2]:= Precision[%]
Out[2]= \[Infinity]
無限精度と機械精度の入力を組み合せると,機械精度の出力になります.
[English]