2009-09-14 117 views
0

我知道鑄造ints到浮動(反之亦然)是相當昂貴的。但是,編譯器會自動在代碼中爲常量自動執行它嗎?對於例如有C++自動將常量整型轉換爲浮點型?

float y = 123; 
float x = 1/y; 

float y = 123.f; 
float x = 1.f/y; 

我看到一些代碼,不會後者之間的任何差別,但我不知道這是否是爲優化或安全問題(即只是確保鴻溝即使y碰巧是一個int也是浮點)。我用gcc

(因爲答案可能是編譯器特定的。)

此外,任何指向什麼樣的編譯器,不能在一般的優化列表,將不勝感激。謝謝!

+0

不知道是不是肯定的 - 但我敢打賭它是真正的錢。 – 2009-09-14 06:34:04

+0

現在的問題是你微觀優化?編譯器應該處理這個。 – 2009-09-14 06:36:54

+0

我通常使用浮點文字寫出fp表達式。在你被一個沒有發生浮動的計算所困擾之後,你可能會得到一個類似的習慣。 – SingleNegationElimination 2009-09-14 06:39:49

回答

2

是的,編譯器會自動執行轉換。你的兩個代碼塊是相同的。

這不是一個優化。關閉優化不會使編譯器在可執行代碼中包含int到float的轉換,除非它是低質量的實現。

它也不是安全的。編譯器從不做任何事情「以防萬一」操作數碰巧是不同的類型。編譯器知道代碼中的所有內容。如果您更改變量的類型,則使用該變量的所有內容都會重新編譯;編譯器不會試圖保持一切不變,只需更新已更改的部分。

+0

我的意思是'安全',因爲程序員可能會使y成爲int而不是浮點數,但是無論如何都要獲得浮點結果。 – int3 2009-09-14 06:44:44

+0

哦。不,絕對不是那樣的話。如果程序員*將*設爲'y',那麼在第一個代碼塊中除法將是整數除法。代碼的含義將完全不同。如果編譯器假定程序員在兩個操作數都是整數時需要浮點除法,反之亦然,這不僅僅是一個低質量的實現;這將是一個錯誤的實現。 – 2009-09-14 06:59:18

+0

我認爲你誤解了我..我的意思是說,也許程序員只是做1.f作爲對自己粗心的預防措施(如TokenMacGuy的評論),但我不確定它是否具有優化價值。但沒關係,無論如何你都回答了我的主要問題。 – int3 2009-09-14 08:29:50

0

是的,它確實如此,所以這兩個片段是相同的。唯一重要的是你分配給的變量的類型。

+0

如果涉及的兩個常量都是int,則結果將被計算爲well(所以'3/2 == 1'),然後才轉換爲float。在這種情況下,兩個代碼片段都是相同的,因爲在這兩種情況下,至少有一個參數是'float'。 – 2009-09-14 06:41:37

0

浮子Y = 123浮子Y = 123.f箱子應該是大部分編譯器相同,但浮子X = 1/Y浮子X = 1.F/Y將如果y是整數,實際上會產生不同的結果。

它確實取決於編譯器 - 有些實際上可能會存儲一個常量int,並在每次將它分配給float變量時將其轉換。

0

有些情況下編譯器將float轉換爲int,例如,

float f; 
if (f > 1) ... 

在編譯器生成的代碼相當於這種情況下,我有它發生(Visual Studio 2008中)到

if (int (f) > 1) ... 
+0

請注意,這是一個非常特殊的情況,優化程序可以確定'(int(f)> = 1)'在邏輯上與'(f> = 1.0f)'相同,但速度更快。你可能會錯誤地記錄下確切的運算符:在你的代碼中,float f = 1.1;''(f> 1)'但是(int(f)== 1)'' – MSalters 2009-09-14 13:34:36

+0

(f == 1)的條件表達式,雖然f> 1.0f,但返回true。我知道這一點,因爲它讓我頭疼,直到我終於明白出了什麼問題。不要相信自動類型轉換。 – karx11erx 2009-09-17 14:21:23