2013-03-18 65 views
1

在我讀了OGRE3D here程序員在他初始化任何變量,結束像200.00f0.00f不斷增加f教程,所以我決定刪除f,看看它是否編譯和它編譯就好了,是什麼在變量的末尾添加f的點?爲什麼有些人在變量的末尾附加f?

編輯:所以你說如果我初始化一個變量與200.03它不會初始化它作爲浮點,但如果我這樣做與200.03f它會呢?如果不是f在哪裏變得有用呢?

+1

'f'的意思是浮動' – 2013-03-18 17:05:15

+4

僅僅因爲它編譯並不意味着它具有相同的含義。 – SLaks 2013-03-18 17:05:57

+0

雖然當我使用它時,它似乎做了完全相同的事情:\對我來說,那些不明白的人,它正在做同樣的事情,因此我在問這是怎麼回事。 – user1958850 2013-03-18 17:07:34

回答

1

這意味着該值將被解釋爲單精度浮點變量(類型float)。如果沒有f後綴,它將被解釋爲雙精度浮點變量(類型爲double)。

這通常是通過將一個double值賦給一個浮點型變量來關閉編譯器警告,說明可能會導致精度損失。當你沒有收到這樣的警告時,你可能已經在你的編譯器設置中關閉了警告(這很糟糕!)。

但它也可以具有subtile語法意義。正如你所知,C++允許具有相同名稱的函數,但其​​參數的類型有所不同。在這種情況下,f後綴可以確定調用哪個函數。

+0

除非它根本沒有小數點,在這種情況下它被解釋爲一個'int' - 可能是這類事情中最常見的錯誤來源。 – us2012 2013-03-18 17:07:09

3

http://msdn.microsoft.com/en-us/library/w9bk1wcy.aspx

浮點常數引用而未F,F,L,或L後綴的類型是 兩倍。如果字母f或F是後綴,則該常量的類型爲浮點型 。如果後綴爲字母l或L,則其類型爲long double。例如: 示例:

4

200.00f不是變量。它不能變化

這是一個編譯時常量,用float表示。 f表示它是float

通過比較,200.00將被解釋爲double

+0

+1用於術語修正。 – JBentley 2013-03-18 17:17:32

2

C標準規定,不斷花車促進操作的兩雙。

float a,b,c; 
... 
a = b+7.1; this is a double precision operation 
... 
a = b+7.1f; this is a single precision operation 
... 
c = 7.1; //double 
a = b + c; //single all the way 

雙精度需要用於恆定更多存儲空間,加上來自單個轉換到加倍的變量操作數,則一個雙重轉換爲單一到分配的結果。隨着所有轉換的進行,如果你不適應如何浮點運算,四捨五入等,你可能得不到你所期望的結果。編譯器可能在某些路徑上優化某些行爲,使其難以理解真正的問題,並且硬件中的fpu可能接受混合模式操作數,同時隱藏真正發生的事情。

它不僅僅是一個速度問題,而且還有準確性。最近有一個SO問題,幾乎是同樣的問題,爲什麼這個比較可以使用一個數字而不是另一個。以分數5/11ths爲例,例如0.454545 ....假設,假設你有10個fpu,單精度3位有效數字,雙精度6位有效數字。

float a = 0.45454545454; 
... 
if(a>0.4545454545) b=1; 
... 

以及在我們假設的系統,我們只能三位數,因爲我們使用的是默認情況下,一輪上漲舍入模式存儲到一個,所以A = 0.455。但我們的比較將被認爲是雙重的,因爲我們沒有把f放在數字的末尾。雙版本是0.454545。一個被轉換爲一個雙這導致0.455000,所以:

if(0.455000>0.454545) b = 1; 

0.455大於0.454545更大所以B將是一個1

float a = 0.45454545454; 
... 
if(a>0.4545454545f) b=1; 
... 

所以現在的比較是單精度所以我們是在比較0.455至0.455,這並不大,所以b = 1不會發生。

當你編寫基數爲10的十進制浮點常量時,計算機中的浮點數是基數2,並且它們不總是順利地轉換,就像5/11一樣,在基11中工作得很好,但是在基10中得到一個無限重複的數字。例如十進制數爲0.1時,會在二進制中創建重複模式。根據尾數捨去舍入的位置,可以使尾數的lsbit舍入或舍入(也取決於您使用的舍入模式,如果您使用的浮點格式甚至舍入)。上面的比較顯示,根據您如何使用變量本身會產生哪些問題。

對於非浮點編譯器通常可以節省你,但有時犯規:

unsigned long long a; 
... 
a = ~3; 
a = ~(3ULL); 
... 

取決於編譯器和計算機兩個任務可以給你不同的結果,一個可能給你0x00000000FFFFFFFC另一個可能給0xFFFFFFFFFFFFFFFC。

如果你想要特定的東西,你應該很清楚,當你告訴編譯器你想要的東西,否則編譯器會進行猜測,並不總是做出你想要的猜測。

+0

對一個微不足道的問題有很好的信息答案。 +1 – 2013-03-18 17:38:07

相關問題