C++ xcode上的atan2f精度

C++ xcode上的atan2f精度,c++,math,C++,Math,我有一个非常简单的代码: #include <cstdio> #include <cmath> int main(int argc, const char * argv[]) { printf("%2.21f", atan2f(0.f, -1.f)); return 0; } 在阅读了atan2f的应用手册页面后,我希望打印值接近3.14159265359,因为他们说,对于像我现在使用的特殊值,他们将返回+pi。正如您所看到的,Xcode上返回的值和

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

#include <cstdio>
#include <cmath>

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

    return 0;
}
在阅读了atan2f的应用手册页面后,我希望打印值接近
3.14159265359
,因为他们说,对于像我现在使用的特殊值,他们将返回
+pi
。正如您所看到的,Xcode上返回的值和期望值之间的差异非常大


这是一个众所周知的问题吗?如果是,是否有解决方法?

单精度浮点数只有大约7位十进制精度。您的测试值
3.14159265359
为12。如果希望获得更高的精度,请使用
double
long double
atan2
atan2l
进行匹配


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

下意识解决方法是使用
atan2
。将其向下转换为
float
得到了
3.141592741012573242188
,就像您的GCC 4.8.1测试一样


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

我正在调试模式下进行测试。在asm代码中,所有平台上都有对atan2f()函数的调用。VS和/或GCC上的
atan2f
是否转换为更高精度的数字?结果中的正确数字是
3.141592
。在所有三种近似中,后面的数字都是错误的;它们是浮点表示的工件。我检查了VisualStudio生成的程序集,调用转到具有更高精度参数的atan2()
Visual Studio 2010: 3.141592741012573200000
GCC 4.8.1         : 3.141592741012573242188
Xcode 5           : 3.141592502593994140625