この質問は、私は常にデフォルトでdouble-precisionするMATLAB変数を理解MATLABでは、デフォルトで変数は本当に倍精度ですか?
...さらにthis questionを調査した後、私は気づいたという奇妙な何かの外に生まれました。だから、私は、小数点以下20桁で変数を宣言するような何かをした場合:
>> num = 2.71828182845904553488;
>> class(num) %# Display the variable type
ans =
double
私は
floating-point relative accuracyは10
-16程度であるので、最後の4桁が、無視されることを期待する:
>> eps(num)
ans =
4.440892098500626e-016
私は(FPRINTFまたはSPRINTFのいずれかを使用して)小数点以下16の以上の数字で番号を表示しようとすると、私は私が見ることを期待ものを手に入れる:
>> fprintf('%0.20f\n',num)
2.71828182845904550000
>> sprintf('%0.20f',num)
ans =
2.71828182845904550000
つまり、数字17〜20は全て0
しかし、私はSymbolic Toolboxにvariable precision arithmetic functionにnum
を渡す際に物事が精度の21桁使って数を表すために、それを言って、おかしく:
>> vpa(num,21)
ans =
2.71828182845904553488
WHAT ?!最後の4桁が再表示されました!入力した元の数値が倍精度変数num
として保存されていたときにそれらが失われてはいけませんか? vpa
に渡されたときにnum
が倍精度変数であるため、vpa
はどのようにしてそれらが分かったのですか?
MATLAB内部では、double精度の変数よりも小数点以下の桁数で初期化して以来、doubleより精度が高いnum
が内部的に表現されています。これは実際に何が起こっているのですか、それとも何か他のことが起こっていますか?
BONUS:あなたはすでに上から片頭痛を持っていない場合そして、ここでは、混乱の追加ソースです...
>> num = 2.71828182845904553488; %# Declare with 20 digits past the decimal
>> num = 2.718281828459045531; %# Re-declare with 18 digits past the decimal
>> vpa(num,21)
ans =
2.71828182845904553488 %# It's the original 20-digit number!!!
+1興味深い質問への有益な答え! – Jonas
Aha!だから私はちょうど私のテスト番号としてバイナリ値の正確な小数の展開を使用していた。今はすべて意味があります!しかし、私がそれを見逃してしまったかどうかは確かではありません...娘が歯が抜けていて、徹夜していたので、睡眠不足が原因でした。 ;) – gnovice
@Andrew:あなたはMathWorksで働いていますか? – Mikhail