在xcode上的atan2f精度

时间:2013-09-23 21:23:42

标签: c++ math

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

#include <cstdio>
#include <cmath>

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

    return 0;
}

在Intel CPU上使用下一个输出:

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

在阅读了针对atan2f的Appple手册页后,我希望打印值接近3.14159265359,因为他们说他们将返回+pi以获取特殊值,例如我现在使用的值。正如您所看到的,Xcode和预期值返回的值相差很大。

这是一个知道问题吗?如果是,是否有解决方法?

2 个答案:

答案 0 :(得分:5)

单精度浮点数只有小数精度的7位数。您的3.14159265359测试值为12.如果您想要更精确,请使用doublelong double以及atan2atan2l进行匹配。

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

答案 1 :(得分:1)

下意识的解决方法是使用atan2。将其转换为float给我3.141592741012573242188就像你的GCC 4.8.1测试一样。

我认为atan2f给出的答案不像float那样精确,因为它通过某种方式得出答案,这意味着估算输出精度是一种更明智的方法。