C++ Visual Studio 2008和Xcode中的浮点精度

C++ Visual Studio 2008和Xcode中的浮点精度,c++,xcode,visual-studio,C++,Xcode,Visual Studio,在VisualStudio2008中,我有一个例子 float a1 = 1.2f/1.8f; float a2 = 450.f; float a3 = a1*a2; float res1 = 350.f - a3; float res2 = 350.f - a1*a2; res1和res2中的值给出了不同的结果,从我读到的内容来看,这是因为a1*a2(在res2中)是以更高的精度完成的,它不同于我们保存在a3中的值 关于Xcode 如果我们有相同的集合,res1和res2给出相同的结果 我

在VisualStudio2008中,我有一个例子

float a1 = 1.2f/1.8f;
float a2 = 450.f;
float a3 = a1*a2;

float res1 = 350.f - a3;
float res2 = 350.f - a1*a2;
res1和res2中的值给出了不同的结果,从我读到的内容来看,这是因为a1*a2(在res2中)是以更高的精度完成的,它不同于我们保存在a3中的值

关于Xcode

如果我们有相同的集合,res1和res2给出相同的结果

我们如何在Xcode中设置以获得与visual studio相同的结果,以及如何在visual studio中设置以获得与Xcode相同的结果

多谢各位

编辑:我在VisualStudio中发现,可以使两者获得相同的结果:

float res1 = 350.f - a3;
float res2 = 350.f - (float)(a1*a2);

这意味着不使用(浮点)时,从350.f中减去更高精度的a1*a2,然后将结果“缩放”为浮点。使用(浮点)a1*a2以更高的精度完成,首先缩放为浮点,然后从350.f中减去更高的精度,然后“缩放”回到float。

编辑以实际回答问题:我怀疑是否有一种保证方法可以始终获得相同的计算结果,并使用不同的编译器生成完全相同的结果-编译器将根据需要拆分/组合各种计算步骤/编辑

这完全取决于编译器如何优化和安排指令。除非您非常清楚自己在做什么(以及编译器将做什么),否则任何浮点计算都需要考虑到在计算步骤中引入的小错误。但是请注意,即使是最低级别的优化,编译器也会计算
a1*a2
一次,而不是两次。这称为“CSE”或“公共子表达式”优化(在一个代码块中多次进行相同的计算)。所以我猜你是在一个“非优化”的构建中测试这个。(在某些情况下,编译器可能不会优化某些东西,因为它会产生不同的结果,但在我看来,这不像是其中之一)


然而,在许多系统上,浮点值的实际计算是以更高的精度完成的,然后在存储值时“缩短”为实际大小的
浮点
双精度
或其他任何值。当您期望相同的结果时,这可能会导致结果不同,因为计算的顺序或方式不同,导致实际值略有不同

除非硬件相同,否则永远不会得到相同的结果。在VS中,您可以尝试/fp:strict选项,以避免英特尔默认使用的更高精度architectures@john我已经尝试过/fp:strict,但它仍然给出相同的结果。visual studio中的代码在发布模式下运行,而在优化模式下则处于完全优化状态。