繁体   English   中英

Visual Studio 2008和Xcode中的浮点精度

[英]Floating point precision in Visual Studio 2008 and Xcode

例如,在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中减去,然后“缩放”为浮点数。

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

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

但是,在许多系统上,以较高的精度进行浮点值的实际计算是完全正确的,然后将其“缩短”为floatdouble的实际大小,或者存储该值时的大小。 当您期望相同的结果时,这可能导致结果有所不同,因为计算以不同的顺序或不同的方式进行,导致实际值略有不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM