假設float a = (1.5 * b)
其中b
是float,那麼這個表達式是如何評估的? 1.5
被視爲double或float?在Visual C++中如何將浮點文字處理爲double或float?
2
A
回答
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 sequences
第13.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
(其不包括像float
到double
更安全促銷)規定:
浮點類型的右值可以被轉換成另一種浮點類型的右值。如果源值可以在目標類型中精確表示,則轉換結果就是該確切表示。如果源值位於兩個相鄰目標值之間,則轉換結果是這些值中任一值的實現定義選項。否則,行爲是不確定的。
作爲浮點升級允許的轉換不包括在浮點轉換集中。
換句話說,如果乘法結果超出浮動範圍的值,則所有的注單都關閉。如果b
約等於浮動的最大絕對值的67%(正值或負值,無關緊要),則很可能會發生這種情況。
相關問題
- 1. C++如何將int整型爲float/double?
- 2. 如何在printf中處理float/double轉換爲int?
- 3. 如何將字節數據轉換爲double或float?
- 4. 在Swift中將字符串小數轉換爲float或double?
- 5. 如何在將列表中的文字轉換爲浮點時處理異常?
- 6. 如何在C中不使用sprintf或ftoa將float/double轉換爲ASCII?
- 7. 將char *轉換爲float或double
- 8. 將c#float轉換爲IEEE單精度浮點字節
- 9. 在C中,float或double類型是如何工作的?
- 10. 將double [] []轉換爲float [] []
- 11. mysql將float轉換爲double
- 12. 將double轉換爲float?
- 13. 將int轉換爲float/double
- 14. 如何將uint32_t轉換爲double或float並打印?
- 15. 將float浮點複製到字符串
- 16. 如何處理浮點數
- 17. 有什麼辦法在C#中將'Double'或'double'轉換爲'const Double'或'const double'?
- 18. 不能將float或double轉換爲字符數組(sprintf)
- 19. c中的float和double#
- 20. 浮點後處理數字
- 21. 浮點數組,float []和double []是不同的,還是相同的?
- 22. 將輸入字符串轉換爲float/double C++
- 23. C++將字符串轉換爲float/double而不丟失數據
- 24. 將字符串[]轉換爲十進制[],int [],float [] .double [] in c#
- 25. 如何在c#中將面板的大小設置爲float/double數據類型?
- 26. C++如何處理const double&引用int?
- 27. 如何將std :: vector <float>轉換爲浮點數組?
- 28. 如何通過浮點表示將float轉換爲uint?
- 29. C#:如何將浮點值整理爲最接近的浮點值?
- 30. float或double特殊值