gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:17:41 36 4
gpt4 key购买 nike

在 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 。使用 (float) a1*a2 以更高的精度完成,首先缩放为 float ,然后以更高的精度从 350.f 中减去,然后“缩放”回 float 。

最佳答案

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

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

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

关于c++ - Visual Studio 2008 和 Xcode 中的浮点精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19976003/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com