我有这个非常简单的代码:
#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和预期值返回的值相差很大。
这是一个知道问题吗?如果是,是否有解决方法?
答案 0 :(得分:5)
单精度浮点数只有小数精度的7位数。您的3.14159265359
测试值为12.如果您想要更精确,请使用double
或long double
以及atan2
或atan2l
进行匹配。
可能VS'和GCC获得“更好”结果的原因是编译器注意到你的函数有常量参数,并且以高于单精度的方式预先计算结果。检查生成的代码以获取证据。
答案 1 :(得分:1)
下意识的解决方法是使用atan2
。将其转换为float
给我3.141592741012573242188
就像你的GCC 4.8.1测试一样。
我认为atan2f
给出的答案不像float
那样精确,因为它通过某种方式得出答案,这意味着估算输出精度是一种更明智的方法。