3

私はこの非常に単純なコードを持っています:

#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

Apple の atan2f のマニュアル ページを読んだ後、印刷された値は near であると予想されます。現在使用しているような特別な値3.14159265359が返されると彼らは言っているからです。+piご覧のとおり、Xcode で返される値と期待される値との差はかなり大きいです。

これは既知の問題ですか?はいの場合、これを解決するための回避策はありますか?

4

2 に答える 2

5

単精度浮動小数点数の 10 進精度は約 7 桁のみです。のテスト値3.14159265359は 12 です。より高い精度が必要な場合は、doubleまたはlong doubleおよびatan2またはatan2lを使用して一致させます。

VS と GCC から「より良い」結果が得られる理由は、コンパイラが関数に定数引数があることに気づき、単精度よりも高い精度で結果を事前計算しているためです。証明のために生成されたコードをチェックしてください。

于 2013-09-23T21:29:59.830 に答える
1

ひざまずく回避策は、を使用することatan2です。それをキャストすると、GCC 4.8.1 テストのようになりfloatました。3.141592741012573242188

出力精度を推定する方が賢明な方法であることを意味する何らかの方法で答えに到達するため、保持できるatan2fほど正確ではない答えを与えると思います。float

于 2013-09-23T21:31:04.340 に答える