gpt4 book ai didi

c++ - 使用 C++ 的 VS6 和 VS2008 之间的数值精度差异?

转载 作者:行者123 更新时间:2023-11-30 02:11:32 25 4
gpt4 key购买 nike

我一直致力于将遗留项目从 Visual Studio 6 移植到 2008。在跨越几个障碍之后,我现在可以构建和执行新项目。但是,我注意到程序的两个版本的输出略有不同,就好像浮点计算并不等同,尽管代码是相同的。

这些差异开始时通常很小 (<1.0E-6),但经过多次计算后会累积到开始对输出产生重大影响的程度。举个例子,在计算的第一步之后,我查看了一个关键变量在内存中的精确 double 存储,并看到:

Visual Studio 6 表示:0x4197D6CC85AC68D9
十进制等值:99988257.4183687120676040649414

Visual Studio 2008 表示:0x4197D6CC85AC68EB
十进制等值:99988257.4183689802885055541992

我已尝试对其进行调试以追踪差异开始的位置,但输出来自迭代数值求解器,因此以如此高的精度进行追踪将是一个耗时的过程。

是否有人知道两个版本的编译器的 double 算术运算之间存在预期差异? (或者关于可能导致此问题的任何其他想法?)

现在我的下一步可能是尝试创建一个简单的演示应用程序来显示问题并且可以更容易地检查。

谢谢!

最佳答案

这只是一个猜测,但大多数现代 Intel/AMD CPU 都有两个独立的 FPU 模型:旧式 i386 FPU 和更新的基于 SSE/SSE2 的模型。后者具有更灵活的编程模型,通常是首选。

您应该检查一下,如果 VS6 和 VS2008 都为同一模型生成代码,因为老式 FPU 有 80 位中间结果,这可能会导致较少的舍入和可能更好的结果,但实际结果取决于优化器。顺便说一句,这是科学界人士真正讨厌的事情。例如,如果操作数溢出到内存中,那么它们将被截断为 64 位,并且会丢失额外的精度。

IIRC 然后 VS6 无法生成 SSE/SSE2 代码,但它有一个/fp:precise 选项可以将所有中间结果四舍五入到它们声明的大小。我认为 VS 2008 也有这个标志。因此,我建议您为两个编译器尝试/fp:precise 并再次比较结果。

关于c++ - 使用 C++ 的 VS6 和 VS2008 之间的数值精度差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3354191/

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