我正在尝试对用 C++ 和 Matlab 编写的算法进行等价测试。该算法包含某种时间循环,运行次数超过 1000 次。它具有算术运算和一些数学函数。
我手动将初始输入提供给两个平台(如 a=1.767,b=6.65,...),当我检查这些输入的十六进制表示时,它们是相同的。所以输入没有问题。并通过 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
答案 - 0x3ff4 7619 7005 5a42
= 2.xxx..xxe-19
我搜索了 matlab 如何处理数字,发现了非常有趣的东西,比如“非规范化尾数”。虽然 realmin 大约是 e-308,但通过对尾数进行非规范化,matlab 具有关于 e-324 的最小实数。此外,matlab 中“pi”或“exp(1)”的位数比 C++ 多得多。
另一方面,matlab help 说无论它显示什么格式,matlab 在内部都使用双精度。
所以,如果有人解释这些差异的确切原因是什么,我真的很感激?我们如何在 matlab 和 c++ 上进行等价测试?