1

非常に小さい数に1を加えることについて質問があります。現在、実数1を中心とする複素平面に円弧をプロットしようとしています。私のコードは次のようになります。

arc = 1 + rho .* exp(1i.*theta);

rhoは非常に小さい数値でありtheta、0からpiまで実行されるため、MATLABの実数部に1が追加されるとarc、MATLABはそれを1に丸めるようにplot(real(arc),imag(arc))見えます。したがって、入力すると、表示されるのはスパイクではなくスパイクだけです。 1の周りの半円。MATLABが1+real(arc)を1に丸めず、代わりに精度を維持するように、これを修正する方法を知っている人はいますか?

ありがとう

4

3 に答える 3

3

rho=1e-6; theta=0:pi/100:pi; arc=1+rho*exp(1i.*theta); plot(arc); figure(); plot(arc-1);

問題がプロットにあり、精度の低下ではないことを示しています。その後rho<1e-13、精度の問題が予想されます。

他の2つの考えられる誤解:-double
は有限の精度を持っています。10進数の16桁または1+2 ^ -52は、doubleの制限です。
-短いフォーマットと長いフォーマット--matlabはデフォルトで6桁または7桁のみを表示します

また、6〜7桁が32ビットfloatの制限である場合もあります。これは、Octave3.4.3のプロット関数もfloatで実装されている可能性があることも説明できます。

左:1 + 1e-6 * exp、右:(1 + 1e-6 * exp)-1

于 2012-11-14T20:56:05.657 に答える
2

まさにこのプローブのための組み込みソリューションがあります:

exp1m()

log1p()

明示的に:

log(arc)=log1p(rho*exp(1i*theta))

必要なものを手に入れるために。

もちろん、この精度を表すにはログスペースで作業する必要がありますが、これはこれが行われる一般的な方法です。

于 2012-11-14T20:56:21.287 に答える
1

倍精度浮動小数点表現では、それより厳密に大きい最小の数値1は です1 + 2^-52

これは、ほとんどのマシンで非整数を表す方法によって課される制限であり、ソフトウェアで回避できますが、簡単には回避できません。MATLAB のアプローチに関するこの質問を参照してください。

于 2012-11-14T20:45:47.323 に答える