7

在 VS c++ 和 MinGW 中运行相同的代码得到不同的结果。结果是双精度类型。示例:在 VS c++ 中得到“-6.397745731873350”,但在 MinGW 中得到“-6.397745731873378”。有垃圾不同。但我不知道为什么?

4

3 回答 3

3

我冒险猜测这是两种可能性之一。

当 Windows NT 是新的时,它们支持移植到其他处理器(例如,MIPS 和 DEC Alpha),MS 有一点问题:处理器都有 64 位浮点类型,但它们有时会产生稍微不同的结果. DEC Alpha 将 64 位双精度数作为64 位双精度数进行计算。x86 上的默认模式有点不同:当您加载一个浮点数时,任何较小的类型都会转换为其内部的 80 位扩展双精度格式。然后所有计算都以 80 位精度完成。最后,当您存储该值时,它被舍入回 64 位。这意味着两件事:首先,对于单精度和双精度结果,英特尔的速度要慢很多。其次,处理器之间的双精度结果通常略有不同。

为了解决这些“问题”,微软建立了他们的标准库来调整浮点处理器,使其只使用 64 位精度而不是 80 位。尽管他们早就放弃了对其他处理器的所有支持,但他们仍然(至少在我上次查看时,如果它改变了我会感到惊讶)将浮点处理器设置为仅以 64 位精度工作。我没有检查确定,但我猜 MingW 可能会将浮点处理器设置为默认的 80 位精度。

还有另一个可能的差异来源:如果您将 32 位编译器与 64 位编译器进行比较,您会得到不同(尽管仍然有些相似)的情况。32 位编译器(Microsoft 和 gcc)使用 x87 风格的浮动寄存器和指令。Microsoft 的 64 位编译器虽然不使用 x87 样式的浮点(至少在默认情况下)。相反,它使用 SSE 指令。我也没有对此进行大量测试,但如果(再次)x87 和 SSE 在保护位和舍入等方面存在细微差别,我一点也不感到惊讶。我根本不会期望有很大的差异,但极有可能会考虑一些细微的差异(几乎是不可避免的)。

于 2012-11-19T04:43:37.527 回答
1

大多数浮点数不能用计算机准确表示。它们是近似值。它们的表述存在一定程度的不可靠性。不同的编译器可能以不同的方式实现不可靠性。这就是为什么你会看到这些差异。

阅读这篇优秀的文章:

于 2012-11-19T04:00:35.557 回答
0
于 2012-11-19T03:58:16.370 回答