2011-12-25 17 views
1

V 8.0.4、windows 7この例では「何も表示できません」と表示されるのはなぜですか?

ハードウェア単精度でMを実行すると高速な計算ができるかどうかを確認しようとしていましたが(これが可能であってもわかりません。私はAbsoluteTimingを私はダブルより少し精度を作るために発生したときだけPauseタイミングに0を返すことに気づいた)事をしようとしますが、シングルよりも良い:ここで

は一例です。

私はカーネルを再起動し、タイプ

r=AbsoluteTiming[Pause[2]] 
{2.00111440000,Null} 

Accuracy[r] 

Out[26]= 11.438897913739035 

は今、私は

$MinPrecision=$MachinePrecision; 
$MaxPrecision=$MachinePrecision; 
r=AbsoluteTiming[Pause[2]] 

Out[32]= {2.001114400000000,Null} 

Accuracy[r] 
Out[33]= 15.653317853034773 

問題ありませんが倍増するMを設定します。

しかし、私はあなたが見

prec=Log[10,2]*29; 
$MaxPrecision=prec; 
$MinPrecision=prec; 

r=AbsoluteTiming[Pause[2]] 

Out[41]= {0.,Null} 

を行うとき、それはゼロです。

Accuracy[r] 
Out[42]= 307.6526555685888 

しかし、私はMが内部の任意精度数値を使用しています知っている

enter image description here

を、それがゼロから実際の秒を返すに反転する場所を正確に確認するためにしようとし続け、1トライ中にこれを得ました:上記のリンクから

http://reference.wolfram.com/mathematica/tutorial/ArbitraryPrecisionNumbers.html

それは言う:

In doing calculations that degrade precision, it is possible 
to end up with numbers that have no significant digits at all 

私の質問はここにあります:誰かがこの例でこの動作を説明できますか? Pause[]のタイミングを計測するのはなぜ単精度よりもはるかに精度が高いのですか? AbsoluteTimeを測定するには、少なくとも2倍の計算が必要です。ヘルプは言う:

In[22]:= $TimeUnit//N 
Out[22]= 0.001 

AbsoluteTiming is always accurate down to a granularity of $TimeUnit 
seconds, but on many systems is much more accurate. 

は実際に私の主な目的は、私はMはそれがより高速に実行するかどうかだけ確認するために、ハードウェアの単精度浮動小数点を使用して計算を実行させることができるかどうかを確認することだけでした。単精度は倍精度の2倍の速さで、これに気づいたときに私が持っているものをテストしようとしていたという本を読みました。

Mは、ハードウェアのダブルを使用して実行されるように私は現在、トップ

$MinPrecision = $MachinePrecision; 
$MaxPrecision = $MachinePrecision; 

で次ですべてを実行します。

ありがとう、 ps。前回のコンソールでこの時間を確認しましたが、構文エラーはありません。

+0

良い質問ですが、私もここでも同じような動作をします。残念ながら私は分かりやすい説明をすることはできません。あなたの質問はよく聞かれるようです。 – nixeagle

+2

あなたは「私はMが内部的に任意精度の数値を使用していることを知っています」と言っています。それは一般的には真実ではありません。 1.0 mmaのような数値を入力すると、精度が追跡されない機械精度の数値が使用されます。 –

答えて

1

最初に、私は$MaxPrecisionおよび/または$MachinePrecisionを設定することは、あなたが望む効果があるとは思わない。ここに例があります。

$MaxPrecision = $MinPrecision = $MachinePrecision; 
result1 = Nest[4 # (1 - #) &, 0.123, 10^6]; // Timing 
result2 = Nest[4 # (1 - #) &, SetPrecision[0.123, 
    $MinPrecision], 10^6]; // Timing 

私のマシンでは、最初の計算には8秒の時間がかかり、2回目の計算には約3秒かかります。現実には、最初の計算は機械計算で行われ、2番目の計算はソフトウェア算術で行われ、その計算は同じ数値精度で行われます。

私はMathematicaの8で機械演算を強制する最も簡単な方法は、False"CatchMachineOverflow""CatchMachineUnderflow"セットでCompileを使用することであると思います。またはそれ以上の場合は"RuntimeOptions""Speed"に設定してください。

また、私はあなたのAbsoluteTimingコマンドで0を得ている理由は、結果を表現するには精度が低すぎると考えます。

+0

私の '$ MaxPrecision = $ MinPrecision = $ MachinePrecision;'をセルの上部に置く主な理由は、実際にはパフォーマンスのためではありません(しかし、パフォーマンスが良くなったら、 MはHWフロートで走ります(私がそうするかどうかはわかりません)。しかし、FortranやMatlabで同じ計算/アルゴリズムを二重で実行すると、結果を比較できるように同じ数値が得られるだけです。このようにして、同じPrecisionで生成された浮動小数点数を調べて、1つの変数を調査から除外します。 – Nasser

関連する問題