この質問 (およびすべての回答) が、小数点以下の桁数ではなく有効桁数で構成されていると、より正確になります。Itamar Katz が示唆したように、IEEE 標準では、倍精度浮動小数点数を仮数 (仮数と呼ぶもの) として 52 ビットで格納します。標準では余分なビットも意味するため、倍精度浮動小数点数には 53 の有効ビットがあります。2 進数を 10 進数に変換すると、15 桁または 16 桁の有効数字に変換されます。
Matlab も Visual C++ も (任意精度のライブラリや 128 ビットの fp 数値を使用するなどの追加機能がなければ) 有効桁数の標準サイズを超える double を格納できません。どちらの言語でも、プログラムが 15 桁 (または 16 桁) を超える 10 進数の数字を表示する場合、超過した桁を信頼することはできません。それらは数値の格納された表現から来たものではなく、メモリと画面の間のどこかに追加されたものです。おそらく、「役立つ」数値フォーマッタは、要求した 19 桁が表示されるまで右端の桁を単純に拡張しただけです。 (または何でも)。
C ++からMatlabへ/から数値を転送する方法、または数値を転送することさえ、質問から完全には明らかではありません。Matlab プログラムの結果を再現する C++ プログラムを書こうとしているだけかもしれません。(私たちはここで多くのことを行っているので、この分野での経験があります。)
「テキスト」ファイルを使用する場合は、数値ではなく数値の表現を転送しています。プログラムがテキスト '15.833' を double 変数に読み込む場合、仮数の余分な数字が取る値について仮定を行うのは安全ではありません。特に、それらが 0 に設定されると想定するべきではありません -- まあ、C++ に詳しい人なら、言語標準ではこれが保証されていると教えてくれるかもしれませんが、Matlab では保証されておらず、C++ はそうではないと思います。どちらかです。追加の数字を設定する場合は、テキスト表現で指定します。これでも、テキスト ファイルで指定された値を正確に保存することは保証されません。変数は、(おそらく) テキスト内の値に最も近い fp 番号を保持します。
ただし、テキスト ファイルが Matlab (または C++) によって記述され、数値のテキスト表現に 15 桁または 16 桁を書き込む場合、それは fp 数値全体のテキスト表現である必要があり、別のプログラムで読み取ったときに翻訳される必要があります。同じfp番号に。ただし、「すべき」と書いていることと、その数字は少なくとも 2 回翻訳されており、コンピューターの数字から目を離すと奇妙なことが起こることに注意してください。
C++ と Matlab の間でデータをビット単位で正確に転送するためのより良い選択は、バイナリ ファイル形式を使用することです。これは double の 64 ビットすべてを 64 ビットとして格納するものです。Matlab MAT ファイル形式は、標準で指定された形式で IEEE754 数値を確実に格納します。
前述のガフのすべてが、別の根本的な問題とは無関係である可能性があります。その問題は、アルゴリズムが安定していない可能性があります。これはまったく別のトピックです。
要約すると:
- プログラム間で数値をバイナリ表現で転送します (ファイルまたはメッセージ パッシングまたはその他のメカニズムを完全に使用するかどうかに関係なく)。
- 倍精度浮動小数点数の 10 進数表現で 15 を超える有効数字を信頼しないでください。
さらに、コードで特別な対策を講じない限り、プログラムは進行するにつれて徐々に精度を失い、下位桁がすべて疑わしい現実になります。あなたが示唆しているアプリケーションの場合、コードの背後にある科学が、有効数字の 15 桁目が異なる 2 つの出力が異なる値を表すという仮説をサポートしている可能性は低いです。入力の基準となる測定値の精度は?