2013-09-23 22 views
3

我有這樣的代碼非常簡單:atan2f精度上的Xcode

#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 

閱讀Appple手冊頁atan2f後,我希望打印的值是接近3.14159265359,因爲他們說他們會返回+pi以獲得像我現在使用的特殊值。正如你所看到的,從Xcode返回的值和期望值之間的差異是相當大的。

這是一個知道的問題?如果是的話,有沒有解決辦法可以解決這個問題?

回答

5

單精度浮點數只有大約7位數的小數精度。您的測試值3.14159265359有12個。如果您想要更高的精度,請使用doublelong doubleatan2atan2l進行匹配。

可能你從VS和GCC獲得「更好」結果的原因是編譯器注意到你的函數有着不變的參數,並且以高於單精度的精度預先計算結果。檢查生成的代碼以進行證明。

+0

我正在調試模式下進行測試。在asm代碼中,在所有平臺上都會調用atan2f()函數。 – Felics

+0

因此VS和/或GCC上的'atan2f'會將高精度數字轉換成多少? –

+1

結果中的正確數字是「3.141592」。所有三個近似值之後的數字都是錯誤的;它們是浮點表示的工件。 – Joni

1

下意識的解決方法是使用atan2。鑄造到float給我3.141592741012573242188就像你的GCC 4.8.1測試。

我會假設atan2f給出的答案並不像float可以持有的那樣精確,因爲它通過某種方式得出其答案,這意味着估計輸出精度是更聰明的方法。