0

私はMS Visual C++ 2005を使ってC++で数学的アルゴリズムを実装しています。私のC++コードでは、Matlabで生成される小数点以下12桁の精度(たとえば、866.333333333333)の10K倍のデータ型入力値が必要です。次に、私のコードはいくつかの計算を行い、同じ入力値で同じアルゴリズムが実行されているときに、MATLAB出力と同じでなければならない機械的実体のダメージ値です。倍精度 - MS Visual C++ 2005 Vs Matlab

私の問題は、matlabは小数点以下12桁の精度で10kの入力値を与えますが、私のC++コードは小数点以下15桁にします。つまり、matlabの866.333333333333はC++の866.33333333333303として使用されます。私はこれがIEEE754浮動小数点表現であることを知っています。 しかし、私は私のC + +の出力をmatlabの出力と比較すると、入力時のこの小さな変化は、最終結果に測定可能な差をもたらします。私は奇妙に聞こえるかもしれませんが、これは観察できるものです。私はここでいくつかのコードを共有することができますが、それは非常に機密です。誰かが私を助けてこれを乗り越えることができたら、本当に感謝しています。事前に

おかげで...!

答えて

2

この質問(および回答)が小数点以下の桁で構成されていると、より正確になります。 Itamar Katz氏が示唆しているように、IEEE標準では、仮数部の仮数部に52ビットの倍精度浮動小数点数を格納しています(仮名と呼ぶものもあります)。また、標準は余分なビットを意味するので、ダブルは53の有意なビットを有する。 2進数が10進表現に変換されると、これは15桁または16桁の有効桁に変換されます。

MatlabでもVisual C++でも(任意精度ライブラリや128ビットf-p番号などの追加機能を使用しない場合)、倍数は標準サイズの有効期限を超えて格納できません。いずれかの言語でプログラムが15桁(または16桁)の10進数であなたに数字を提示する場合、あなたは余分な数字を信じることはできません。彼らは数字の格納された表現から来ていない、彼らはメモリと画面の間の行に沿って追加されました - おそらく '有用な'数値フォーマッタは、あなたが要求した19桁を見るまで(または何でも)。

C++からMatlabへ/からMatlabへの番号の転送方法や、番号の転送方法については全く分かりません。 Matlabプログラムの結果を再現するC++プログラムを作成しようとしているだけかもしれません。

「テキスト」ファイルを使用する場合は、番号ではなく番号の表記を転送します(このフィールドで多くのことを行います)。あなたのプログラムが'15 .833 'のテキストを二重変数に読み込んだ場合、仮数部の余分な数字によって取られた値については何も仮定するのは安全ではありません。特に、あなたはそれらが0に設定されていると仮定すべきではありません - 私は、C++に関して知識が豊富な人が、言語標準がこれを保証していますが、Matlabは保証していないと思います。いずれかを行います。余分な数字を設定する場合は、テキスト形式で指定します。これでも、テキストファイルに指定されているとおりに正確に値を格納することが保証されるわけではありません。変数は、おそらくテキストの値に最も近いf-p番号を保持します。

ただし、テキストファイルがMatlab(またはC++)によって書かれ、数値のテキスト表現に15桁または16桁を書き込む場合は、fp番号全体のテキスト表現でなければならず、別のプログラム同じfp番号に変換されるはずです。しかし、私は 'should'と書いてあり、数字は少なくとも2回翻訳されていて、コンピュータ上の数字から目を離すと奇妙なことが起こることに注意してください。

C++とMatlabの間でビット精度でデータを転送する方が良いのは、64ビットの64ビットを64ビットとして保存するバイナリファイル形式を使用することです。 Matlab MATファイルフォーマットは、標準で指定された形式で確実にIEEE754番号を格納します。

上記のguffはすべて、別の根底にある問題とは無関係かもしれません。その問題は、あなたのアルゴリズムが安定していない可能性があります - これは他のトピック全体です。

は、要約すると:プログラム間から

  1. 転送番号を自分のバイナリ表現で(あなたがファイルまたはメッセージ・パッシングまたは完全に他のメカニズムを使用するかどうか)。
  2. 倍精度浮動小数点数の小数点以下の表現で15桁以上の桁数を信頼しないでください。

また、コード内で特別な対策を講じない限り、プログラムの進行状況が徐々に低下し、すべての下位桁が疑わしい現実になる可能性があります。あなたが知っているアプリケーションでは、コードの背後にある科学が、15番目の有効桁で異なる2つの出力が異なる値を表すという仮説を支持することは考えにくい。あなたの入力が基づいている測定の正確さは?

1
  1. 浮動小数点数データ型は、数値を表すために使用されるビット数と、これらのビットを解釈するために使用される規則(IEEE754標準)によって定義されます。
  2. 一般に、2つの異なる「環境」(つまり、プラットフォーム/ CPU /コンパイラなど)で同じ出力を実現するのは簡単な作業ではありません。緩やかな例として、コンパイラがa+b+cのような式を計算する際に、浮動小数点計算で異なる結果をもたらすかもしれない(a+b)+cまたはa+(b+c)のいずれかとして自由度があるかもしれないと考えてください。私は強くお勧めします---本当に重要なのはまったく同じ結果を得ていますか?
  3. 2で書かれた内容にもかかわらず、あなたのケースでは可能性があります。最初のステップとして、テキストではなく、データのバイナリ表現を使用する必要があります。つまり、データを表すバイトを保持し、それをC++コードに渡します。たとえば、1.0を渡す代わりに、0x3FF0000000000000を渡します(は正確にバイナリ表現可能ですが、これは単なる例です)。

もちろん、いくつかのコードが役に立ちます。機密情報を漏らさずに問題を示すおもちゃの例を構築してみてください。

+0

ありがとうございました – Yogi