C++ および Matlab で記述されたアルゴリズムで同等性テストを作成しようとしています。このアルゴリズムにはある種の時間ループが含まれており、1000 回以上実行されます。算術演算といくつかの数学関数があります。
初期入力を両方のプラットフォームに手動で供給します (a=1.767、b=6.65 など)。これらの入力の 16 進表現を確認すると、それらは同じです。したがって、入力には問題ありません。そして、10 進数 16 桁のテキスト ファイルで c++ の出力を matlab に取得します。(私は「setprecision(32)」ステートメントを使用します)
しかし、ここで問題が発生します。両方のコードの 614 番目のステップの後、すべての結果はまったく同じですが、615 のステップでは 2.xxx..xxe-19 について違いがありますか? そして、このステップの後、誤差はますます大きくなり、実行の最後には約 5.xx..xxe-14 になります。
0x3ff1 3e42 a211 6cca--->[C++ 関数]--->0x3ff4 7619 7005 5a42
0x3ff1 3e42 a211 6cca--->[MATLAB 関数]--->ans
ans - 0x3ff4 7619 7005 5a42
= 2.xxx..xxe-19
matlab が数値をどのように扱うかを調べたところ、「非正規化仮数」のような非常に興味深いものが見つかりました。realmin は約 e-308 ですが、仮数部を非正規化することにより、matlab は e-324 について最小の実数になります。さらに、matlab は "pi" または "exp(1)" の桁数を c++ よりも多く保持します。
一方、matlab のヘルプには、表示される形式が何であれ、matlab は内部で倍精度を使用すると書かれています。
だから、誰かがこれらの違いの正確な理由を説明してくれたら本当にありがたいです? matlab と c++ で同等性テストを行うにはどうすればよいですか?