0

在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);

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

4

1 回答 1

1

编辑以实际回答问题:我怀疑是否有一种保证方法可以始终使用不同的编译器产生相同的计算产生完全相同的结果 - 编译器将按照它认为合适的方式拆分/组合各种计算步骤。/编辑

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

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

于 2013-11-14T11:28:59.943 回答