Visual Studio 2008和Xcode中的浮点精度

瓦尔恩1807

在Visual Studio 2008中,我有这样的例子

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和res 2给出相同的结果

如何在Xcode中进行设置以使其与Visual Studio中的结果相同,以及如何在Visual Studio中进行设置以与Xcode中的结果相同?

谢谢

编辑:我发现在Visual Studio中提供相同的结果是:

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

因此,这意味着从350.f中减去没有(浮动)a1 * a2的精度较高的情况,然后将结果“缩放”为浮动。使用(float)a1 * a2以更高的精度完成操作,首先将其缩放为浮点数,然后以更高的精度从350.f中减去,然后“缩放”为浮点数。

马特·彼得森(Mats Petersson)

编辑以实际回答这个问题:我怀疑是否有保证方法可以始终使相同的计算在不同的编译器中产生完全相同的结果-编译器将视需要拆分/合并各种计算步骤。/编辑

所有这些都归结为编译器如何精确地优化和安排指令。除非您非常了解自己在做什么(以及编译器将做什么),否则任何浮点计算都将需要考虑在计算步骤中引入的小错误。但是请注意,我希望即使是最低级别的优化,编译器也可以计算a1 * a2一次ONCE,而不是两次。这称为“ CSE”或“通用子表达式”优化(在一个代码块中多次执行相同的计算)。因此,我猜测您是在“未优化”的版本中对此进行测试。(在某些情况下,编译器可能不会优化事情,因为它会产生不同的结果,但这对我来说似乎不是其中之一)。

然而,这是完全正确的,关于很多系统,浮点值的实际计算时以更高的精度进行,然后“缩短”,以实际尺寸floatdouble或当值店什么的。当您期望相同的结果时,这可能导致结果有所不同,因为计算是按照不同的顺序或不同的方式进行的,从而导致实际值略有不同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章