2011-03-04 159 views
26

我見過的代碼,人們初始化浮點型變量是這樣的:初始化(C)時0.0f的意義是什麼?

float num = 0.0f; 

是否有這之間的差異顯著,只是在做下面的下面?

float num = 0; 

謝謝.. :)

+2

許多重複,例如, [在目標C/C中的數字/浮動後的「f」)(http://stackoverflow.com/questions/2391818/f-after-number-float-in-objective-cc) – 2011-03-04 21:24:23

+1

他們可能會離開f 。一朝被蛇咬十年怕井繩。 – 2011-03-04 21:25:11

回答

42

float x = 0有一個從int到float的隱式類型轉換。
float x = 0.0f沒有這樣的類型轉換。
float x = 0.0具有從double到float的隱式類型轉換。

根據編譯器的不同,隱式類型轉換可能要求編譯器生成額外的代碼。

+7

如果你有一個在運行時執行類型轉換的編譯器,那麼你的性能問題比一個額外的類型轉換更大。唯一的例外是在運行時可以選擇精確的浮點模式,在這種情況下,編譯器不一定知道正確的類型轉換是什麼(儘管在這種情況下很明顯)。 – 2011-03-04 21:37:17

+1

是的,我上次看到問題出在Vax C編譯器上。 – EvilTeach 2011-03-04 21:42:29

+0

即膨脹的可執行文件(略)?這不是一個4k可執行競賽競爭對手會認爲可以接受的事情。 – bobobobo 2012-09-28 09:50:39

3

嘛,嚴格地說,0是一個整數,所以float num = 0需要從整數鑄造浮動。但是我想編譯器會爲你做這件事。我想人們使用0.0f爲了強調這是一個浮點數,所以沒有人錯誤的整數。

3

Paul R已經寫了答案。你的第二個例子有一個整數初始化值。

您應該始終使用與正在初始化的變量相同類型的初始化程序。這可以避免在編譯時(理想情況下)或運行時(懶惰的編譯器:這是懶惰的,但?)的任何轉換。也許更重要的是,在一般情況下,轉換會導致一些奇怪的事情。

這裏的轉換應該完全符合預期,但它仍然是很好的風格並避免了編譯器警告。

7

用相同類型的文字常量初始化變量只是一種很好的做法。在這種情況下,你有一個浮點變量,你應該用一個浮點常量來初始化它,即0.0f,而不是一個int(0),然後它被隱式地轉換爲浮點數。

7

可能的原因是,他們曾經寫的東西,如:

float f = 1/i; // i an integer 

已經調試,他們發誓永遠充分裝點文字,以獲得正確類型:

float f = 1.0f/i; 

在這種情況下, .0是確保劃分是浮點數,而不是整數除法。 f是因爲不需要在double中完成操作 - 我預計執行的可能性更大,其中1.0/i由於沒有益處(軟件浮點仿真,無差別優化)而顯着更慢,而其中1.0f明顯更慢沒有任何好處(如果double比float更快,那是因爲你有fp硬件,所以兩者之間的轉換速度會非常快,所以不會引入顯着的減速)。

一個你坐進裝飾文字的習慣,你可能會寫:

float f = 0.0f; 

即使它有完全一樣float f = 0.0;float f = 0;同樣的效果。

當然,作者本人可能沒有經歷過這個啓示,他們可能只是繼承了其他人的風格。

我只是寫0

R ..在評論中指出另一個答案,寫0也有一個好處,即當將來更改f的類型時,不必更新文字以匹配。如果分配是自定義分開,然後改變:

float f = something 
// some time later 
f = 0.1f; 

到:

double f = something; 
// some time later 
f = 0.1f; 

可能是一個錯誤。最好使用0.1,並讓編譯器在必要時截斷浮動。你可能會爭辯說,使用float根本就是空間優化(如果不是時間的話),處理float和double之間任何差異的負擔應該算作執行該優化的開發人員成本。

0

我沒有看到任何理由使用這個初始化過程。但是,對於涉及浮點文字的操作,這將會很有用。例如, ;

float a=0.43, b; 
b = 0.5*a + 2.56*a*a; 

沒有後綴的浮點文字被認爲是雙打。因此,對於這種計算,「a」將被加倍輸入,RHS評估的最終答案將是雙倍。在分配過程中,RHS的雙倍值被浮動並賦值爲「b」。如果機器沒有雙精度FPU,則會降低性能。爲了避免這種情況,並使用float進行整個計算。後綴被使用。例如,

float a=0.43, b; 
b = 0.5f*a + 2.56f*a*a;