簡體   English   中英

如何在Visual C ++中將浮點文字處理為double或float?

[英]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 sequences13.3.3.1 Standard conversion sequences定義了處理轉換的方式,但在此處重復有點干。 我只想說浮點升級已完成,第4.6 Floating point promotion4.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 conversions4.8 Floating point conversions包括更安全的促銷,如float to double )狀態:

浮點類型的右值可以轉換為另一個浮點類型的右值。 如果源值可以在目標類型中准確表示,則轉換的結果就是精確表示。 如果源值在兩個相鄰目標值之間,則轉換結果是這些值中任一個的實現定義選擇。 否則,行為未定義。

浮點促銷中允許的轉化從浮點轉化集中排除。

換句話說,如果乘法導致浮點范圍之外的值,則所有投注均關閉。 如果b約為浮點數最大絕對值的67%(正數或負數,無關緊要),則很可能發生這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM