2012-01-06 22 views

回答

5

1.5是雙,採用1.5F浮法,其實際作用:

float a = (float)(1.5 * (double)b)

3

1.5是浮點文字,雙重價值。 C++ 03 2.13.3 Floating literals有這樣說:

一個浮動文本由一個整數部分,一個小數點,一個小數部分,電子或E,任選符號整數指數,和一個可選的類型後綴組成。 ...除非通過後綴明確指定,浮點文字的類型是雙精度的。

13.3.3.1 Standard conversion sequences13.3.3.1 Standard conversion sequences號定義了處理轉換的方式,但在這裏重複要稍微乾燥。只需說浮點數提升已完成,並且部分4.6 Floating point promotion指出:

float類型的右值可以轉換爲double類型的右值。價值不變。

因此,float b被提升爲一個double來執行乘法。

然後,使用(有效)臨時double執行計算,結果是回到float a

因此,有效:

float b = something; 

double xyzzy0 = 1.5; 
double xyzzy1 = (double)b; 
double xyzzy2 = xyzzy0 * xyzzy1; 
float a = xyzzy2; 

這最後一步可能是有問題的。部4.8 Floating point conversions(其包括像floatdouble更安全促銷)規定:

浮點類型的右值可以被轉換成另一種浮點類型的右值。如果源值可以在目標類型中精確表示,則轉換結果就是該確切表示。如果源值位於兩個相鄰目標值之間,則轉換結果是這些值中任一值的實現定義選項。否則,行爲是不確定的。

作爲浮點升級允許的轉換不包括在浮點轉換集中。

換句話說,如果乘法結果超出浮動範圍的值,則所有的注單都關閉。如果b約等於浮動的最大絕對值的67%(正值或負值,無關緊要),則很可能會發生這種情況。

相關問題