0

スクリプトを matlab から C++ 関数にコピーしています。ただし、 exp 関数の結果は常に異なります。たとえば、次のスニペット:

std::complex<double> final_b = std::exp(std::complex<double>(0, 1 * pi));

MATLAB コードと同等である必要があります

final_b = exp(1i * pi);

しかし、そうではありません。MATLAB では -1 + 0i (これは正しい) を受け取り、C++ では -1 + -2.068231e-013*i を受け取ります。

最初はこれは一種の丸め誤差だと思っていましたが、私が使用している実際のスクリプトでは、より大きな複雑な指数関数を使用しているため、まったく異なる数値が得られます。これの原因は何ですか?これを修正するにはどうすればよいですか?

編集:オイラー式で指数関数を手動で計算しようとしました

exp(x+iy) = exp(x) * (cos(y) + i*sin(y)) 

C ++で同じ不安定な結果を得る

4

1 に答える 1

1

これは、浮動小数点近似 (または不正確さ) と呼ばれます。

ヘッダーを含める場合、cfloatいくつかの定義があります。特に、DBL_EPSILONは の最小数で1.0 + DBL_EPSILON != 1.0あり、通常は1e-9(そしてそれより-2.068231e-013はるかに小さい) です。次のコードを実行すると、ゼロかどうかを確認できます。

// The complete formula is std::abs(a - b), but since b is zero, I am ommiting it
if (std::abs(number.imag()) < DBL_EPSILON) {
    // The number is either zero or very close to zero
}

たとえば、ここで動作するコードを確認できます: http://ideone.com/2OzNZm

于 2014-04-30T16:15:29.303 に答える