0

C ++とMATLABが同じ浮動小数点計算の実装を使用しているかどうか誰かに教えてもらえますか?Matlabの場合と同じ値をC++で取得できますか?

現在、MatlabコードをC++に変換する際に次のような矛盾があります。

Matlab: R = 1.0000000001623, I = -3.07178893432791e-010, C = -3.79693498864242e-011

C++:    R = 1.00000000340128 I = -3.96890964537988e-009  Z = 2.66864907949582e-009

そうでない場合、違いは何ですか?浮動小数点計算の実装についてどこでもっと見つけることができますか?

ありがとう!

4

2 に答える 2

1

実際の数値は明確ではありませんが、最初の(そして最大の)数値の相対的な差は約1e-8であり、これは多くの倍精度アルゴリズムの相対的な許容誤差です。

浮動小数点数は実数システムの近似値にすぎず、その有限サイズ(倍精度の場合は64ビット)によって精度が制限されます。この有限の精度のため、浮動小数点数を含む操作では丸め誤差が発生する可能性があり、厳密には結合法則ではありません。これが意味するのは、A +(B + C)!=(A + B)+Cということです。相対的なサイズにもよりますが、通常、この2つの違いはわずかですが、常にゼロであるとは限りません。

これが意味するのは、MatlabでコーディングされたアルゴリズムをC ++のアルゴリズムと比較する場合、相対値と絶対値にわずかな違いがあることを期待する必要があるということです。違いはライブラリにある可能性があります(つまり、Matlabがのようなルーチンにシステム数学ライブラリを使用するという保証はありませんsqrt)。または、C++とMatlabの実装の順序が異なるだけかもしれません。

Boost :: Testの浮動小数点比較テストのセクションでは、これについて少し説明しており、いくつかの優れたリファレンスがあります。特に、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを読んで、KnuthのTAOCPVol。II

于 2012-07-13T01:28:37.453 に答える
0

Matlabはデフォルトで倍精度浮動小数点数を使用し、C浮動小数点数は単精度浮動小数点数を使用します。

フローティングポイントの表現は2つで同じであり、プロセッサであるか、標準であると私は信じています。しかし、前述のように、フローティングポイントは非常に気まぐれであるため、常にある程度の許容範囲を考慮する必要があります。以下のような複雑な操作を行うと、代数が別の方法で指示しているにもかかわらず、ゼロ以外の数値が得られることがよくあります。matlabとcを使用して操作を実行する方法の内部にあるものにより、いくつかの違いが生じます。それらが近くにあることを確認してください。

((3*pi+2)*5-9)/2-7.5*pi-3
于 2012-07-13T02:48:35.970 に答える