3

我有这个非常简单的代码:

#include <cstdio>
#include <cmath>

int main(int argc, const char * argv[])
{
    printf("%2.21f", atan2f(0.f, -1.f));

    return 0;
}

英特尔 CPU 上的下一个输出:

Visual Studio 2010: 3.141592741012573200000
GCC 4.8.1         : 3.141592741012573242188
Xcode 5           : 3.141592502593994140625

在阅读了 atan2f 的 Apple 手册页后,我希望打印的值接近3.14159265359,因为他们说他们会返回+pi特殊值,比如我现在使用的值。如您所见,Xcode 返回的值和预期值之间的差异很大。

这是一个已知问题吗?如果是,是否有任何解决方法可以解决此问题?

4

2 回答 2

5

单精度浮点数只有大约 7 位十进制精度。您的测试值为3.1415926535912。如果您想要更好的精度,请使用doubleorlong doubleatan2oratan2l来匹配。

您从 VS 和 GCC 获得“更好”结果的原因可能是编译器注意到您的函数具有常量参数,并且正在以高于单精度的方式预先计算结果。检查生成的代码以获取证据。

于 2013-09-23T21:29:59.830 回答
1

下意识的解决方法是使用atan2. 把它归结为float给了我3.141592741012573242188就像你的 GCC 4.8.1 测试一样。

我会假设atan2f给出的答案不如 afloat可能的那么精确,因为它通过某种方式得出答案,这意味着估计输出精度是一种更聪明的方法。

于 2013-09-23T21:31:04.340 回答