![](/img/trans.png)
[英]How is floating point conversion actually done in C++?(double to float or float to double)
[英]How a floating point literal is treated either double or float in Visual C++?
假設float a = (1.5 * b)
,其中b
是float,那么這個表達式是如何計算的? 1.5
被視為雙重或浮動?
1.5是double,使用1.5f浮點數,它實際上是做什么的:
float a = (float)(1.5 * (double)b)
1.5
是浮點字面值,雙精度值。 C ++ 03 2.13.3 Floating literals
有這樣的說法:
浮動文字由整數部分,小數點,小數部分,e或E,可選的有符號整數指數和可選的類型后綴組成。 ...除非后綴明確指定,否則浮動文字的類型為double。
第13.3.3.1 Standard conversion sequences
節13.3.3.1 Standard conversion sequences
定義了處理轉換的方式,但在此處重復有點干。 我只想說浮點升級已完成,第4.6 Floating point promotion
節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
節4.8 Floating point conversions
( 不包括更安全的促銷,如float
to double
)狀態:
浮點類型的右值可以轉換為另一個浮點類型的右值。 如果源值可以在目標類型中准確表示,則轉換的結果就是精確表示。 如果源值在兩個相鄰目標值之間,則轉換結果是這些值中任一個的實現定義選擇。 否則,行為未定義。
浮點促銷中允許的轉化從浮點轉化集中排除。
換句話說,如果乘法導致浮點范圍之外的值,則所有投注均關閉。 如果b
約為浮點數最大絕對值的67%(正數或負數,無關緊要),則很可能發生這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.