gpt4 book ai didi

c++ - matlab 和 c++ 的精度差异

转载 作者:可可西里 更新时间:2023-11-01 15:52:37 30 4
gpt4 key购买 nike

我正在尝试对用 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

ans - 0x3ff4 7619 7005 5a42

= 2.xxx..xxe-19

我搜索了 matlab 如何处理数字并发现了非常有趣的东西,例如“非规范化尾数”。虽然 realmin 大约是 e-308,但通过对尾数进行非规范化,matlab 具有大约 e-324 的最小实数。此外,matlab 比 c++ 拥有更多的“pi”或“exp(1)”数字。

另一方面,matlab 帮助说明无论显示何种格式,matlab 都在内部使用 double 。

那么,如果有人解释这些差异的确切原因是什么,我将不胜感激?如何在matlab和c++上进行等价性测试?

最佳答案

在 x86 CPU 中有一个关于 float 的东西。在内部,浮点单元使用 10 个字节的寄存器,即 80 位。此外,CPU 有一个设置,告诉浮点计算应该使用 32 位 (float)、64 位 (double) 还是 80 位精度。较低的精度意味着更快地执行浮点运算。 (32 位模式曾经在视频游戏中很流行,速度高于精度)。

据此,我记得我在计算库 (dll) 中跟踪了一个错误,无论是从测试 C++ 可执行文件还是从 MatLab 启动,给定相同的输入都不会给出相同的结果。此外,这并没有发生在 Debug 模式下,仅在 Release 模式下!

最终结论是 MatLab 确实将 CPU 浮点精度设置为 80 位,而我们的测试可执行文件没有(并保留默认的 64 位精度)。此外,这种计算不匹配并没有发生在 Debug模式下,因为所有变量都被写入到内存中的 64 位 double 变量中,然后从那里重新加载,使额外的 16 位无效。在 Release 模式下,一些变量被优化掉(不写入内存),并且所有计算仅使用浮点寄存器完成,在 80 位上,保持额外的 16 位非零值。

不知道这是否有帮助,但也许值得了解。

关于c++ - matlab 和 c++ 的精度差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11151609/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com