在Xcode上atan2f的精度问题

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

阅读了Apple手册中关于atan2f的页面后,我期望打印出来的值应该接近于3.14159265359,因为他们说对于像我现在使用的特殊值,会返回+pi。但是如您所见,从Xcode返回的值和期望值相差很大。
这是否是已知问题?如果是,有没有解决方法?
2个回答

5
一个单精度浮点数只有大约7位小数精度。您的测试值为3.14159265359,有12位小数。如果您需要更好的精度,请使用doublelong double并使用atan2atan2l进行匹配。
很可能你从VS和GCC中得到“更好”的结果是因为编译器注意到你的函数具有常量参数,并在高于单精度的精度上预先计算结果。请检查生成的代码以证明。

我正在调试模式下进行测试。在汇编代码中,所有平台都会调用atan2f()函数。 - Mircea Ispas
在VS和/或GCC中,atan2f是否会将数字转换为更高的精度? - Carl Norum
1
结果中正确的数字是3.141592。在所有三个近似值之后的数字都是错误的;它们是浮点表示的产物。 - Joni
我检查了Visual Studio生成的汇编代码,发现调用atan2函数时使用了更高精度的参数。(http://cs.smith.edu/~thiebaut/ArtOfAssembly/CH14/CH14-4.html#HEADING4-5) - Mircea Ispas

1
膝反射式的解决方法是使用atan2。将其转换为float后,我得到了3.141592741012573242188,就像您的GCC 4.8.1测试结果一样。
我认为atan2f给出的答案可能不如float精确,因为它通过某种方式得出答案,估计输出精度是一个更明智的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接