この質問(および回答)が小数点以下の桁で構成されていると、より正確になります。 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はすべて、別の根底にある問題とは無関係かもしれません。その問題は、あなたのアルゴリズムが安定していない可能性があります - これは他のトピック全体です。
は、要約すると:プログラム間から
- 転送番号を自分のバイナリ表現で(あなたがファイルまたはメッセージ・パッシングまたは完全に他のメカニズムを使用するかどうか)。
- 倍精度浮動小数点数の小数点以下の表現で15桁以上の桁数を信頼しないでください。
また、コード内で特別な対策を講じない限り、プログラムの進行状況が徐々に低下し、すべての下位桁が疑わしい現実になる可能性があります。あなたが知っているアプリケーションでは、コードの背後にある科学が、15番目の有効桁で異なる2つの出力が異なる値を表すという仮説を支持することは考えにくい。あなたの入力が基づいている測定の正確さは?
ありがとうございました – Yogi