2015-10-17 87 views
0

enter image description here當我直接輸出std :: pow(10,2)時,我得到100 while(long)(pow(10,2))給出99.有人可以解釋這個嗎?C++ pow異常類型轉換

cout<<pow(10,2)<<endl; 
cout<<(long)(pow(10,2))<<endl; 

該代碼基本上是在主函數中。

編譯器使用碼塊 視窗8.1是否有幫助

+1

顯示您正在使用的代碼。你是否像這樣直接打電話給你。在這種情況下真的很奇怪。 – knightrider

+0

是它的奇怪! –

+0

對我來說它是100 100(gcc4.9和clang 3.6)。你正在使用哪種編譯器?你使用標準的數學庫還是你使用自定義實現? – knightrider

回答

0

這些都是性病::戰俘重載:

float  pow(float base, float exp); 

double  pow(double base, double exp); 

long double pow(long double base, long double exp); 

float  pow(float base, int iexp);//(until C++11) 

double  pow(double base, int iexp);//(until C++11) 

long double pow(long double base, int iexp); //(until C++11) 

Promoted pow(Arithmetic1 base, Arithmetic2 exp); //(since C++11) 

但你奇怪的行爲是MINGW的約兩倍的存儲和Windows如何運行時犯規喜歡它的怪事。我假設Windows正在看到類似於99.9999的東西,並且當它被轉換爲整體類型時,它會佔據地板。

int a = 3/2; // a is = 1 

MinGW的使用Microsoft C運行時庫及其實施的printf不支持「長雙」型。作爲解決方法,您可以轉換爲'double'並將其傳遞給printf。因此,您需要雙倍加倍:

在x86架構上,大多數C編譯器實現long double,因爲x86硬件支持的80位擴展精度類型(有時存儲爲12或16字節以維持數據結構對齊),如C99/C11標準(IEC 60559浮點算術(附錄F))中所規定的。 Microsoft Visual C++ for x86是一個例外,它使得long double成爲double的同義詞。[2] Microsoft Windows上的英特爾C++編譯器支持擴展精度,但要求長雙精度/ Qlong-double開關對應於硬件的擴展精度格式[3]。