2010-11-19 5 views
6

sprintfコマンドを使用して次に起こることはわかりません。MATLABでsprintfで変数の小数点を表示

>> vpa(exp(1),53) 

ans = 

2.7182818284590455348848081484902650117874145507812500 


>> e = 2.7182818284590455348848081484902650117874145507812500 

e = 

2.7183 

>> sprintf('%0.53f', e) 

ans = 

2.71828182845904550000000000000000000000000000000000000 

はなぜsprintfは数eは四捨五入の代わりの数と、私は最初の場所に保た私を見るのでしょうか?作成した変数eは約16桁で、二重の精度が、これに限定されているので、

+0

これはあなたの質問とは関係ないかもしれませんが、 'e'の真の数字が必要な場合は' vpa( 'exp(1)'、53)の代わりに ' – MarkV

+0

を入力してください。それ。ありがとうございました! – Peterstone

答えて

5

変数は、MATLABのデフォルトによってdouble precisionです。より多くの桁を入力したにもかかわらず、doubleは正確にすべての余分な桁を表す精度を持たず、最も近い数字に丸めます。

EDIT:としては、私が投稿this follow-up questionに彼の答えにAndrew Jankeことで、より詳細に説明するように、あなたがeのために選択した番号は、ちょうどバイナリ値の正確な小数の拡張であることを起こります。言い換えれば、近くの浮動小数点数が丸められる正確に表現可能な値です。しかし、この場合、小数点を過ぎて約16桁を超えるものは、倍精度型では正確には表現できないため、重要ではありません。したがって、SPRINTFのような関数は自動的にこれらの小さな値を無視し、代わりにゼロを出力します。

+1

手順をスキップしました。sprintfを使用すると、eは暗黙的にdoubleに変換されます。変数は... – Marc

+1

@Marc:Hm?ここでは、コピーと貼り付けのためにリテラルから初期化されているため、eはすでにdouble型です。 Matlabでは、すべての数値リテラルが2つの値を生成します。 "class(2.7182818284590455348848081484902650117874145507812500)"で確認できますが、これは 'double'を返します。クラス(exp(1))もdoubleです。表示される数字のほとんどは、精度の倍数の限界を超えているので偽です。 vpa()はprintf()のようにそれらをゼロにしません。 –

+0

あなたはそうです。私はコードでそれを逃した。 – Marc

関連する問題