在我讀了OGRE3D here程序員在他初始化任何變量,結束像200.00f
或0.00f
不斷增加f
教程,所以我決定刪除f
,看看它是否編譯和它編譯就好了,是什麼在變量的末尾添加f
的點?爲什麼有些人在變量的末尾附加f?
編輯:所以你說如果我初始化一個變量與200.03
它不會初始化它作爲浮點,但如果我這樣做與200.03f
它會呢?如果不是f在哪裏變得有用呢?
在我讀了OGRE3D here程序員在他初始化任何變量,結束像200.00f
或0.00f
不斷增加f
教程,所以我決定刪除f
,看看它是否編譯和它編譯就好了,是什麼在變量的末尾添加f
的點?爲什麼有些人在變量的末尾附加f?
編輯:所以你說如果我初始化一個變量與200.03
它不會初始化它作爲浮點,但如果我這樣做與200.03f
它會呢?如果不是f在哪裏變得有用呢?
這是一種指定該數字必須被解釋爲「float」而不是「double」(這是C++十進制數字的標準並使用了兩倍內存)的方法。
這個討論可能會有所幫助:
這意味着該值將被解釋爲單精度浮點變量(類型float
)。如果沒有f後綴,它將被解釋爲雙精度浮點變量(類型爲double
)。
這通常是通過將一個double值賦給一個浮點型變量來關閉編譯器警告,說明可能會導致精度損失。當你沒有收到這樣的警告時,你可能已經在你的編譯器設置中關閉了警告(這很糟糕!)。
但它也可以具有subtile語法意義。正如你所知,C++允許具有相同名稱的函數,但其參數的類型有所不同。在這種情況下,f後綴可以確定調用哪個函數。
除非它根本沒有小數點,在這種情況下它被解釋爲一個'int' - 可能是這類事情中最常見的錯誤來源。 – us2012 2013-03-18 17:07:09
從http://msdn.microsoft.com/en-us/library/w9bk1wcy.aspx
浮點常數引用而未F,F,L,或L後綴的類型是 兩倍。如果字母f或F是後綴,則該常量的類型爲浮點型 。如果後綴爲字母l或L,則其類型爲long double。例如: 示例:
200.00f
不是變量。它不能變化。
這是一個編譯時常量,用float
表示。 f
表示它是float
。
通過比較,200.00
將被解釋爲double
。
+1用於術語修正。 – JBentley 2013-03-18 17:17:32
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。
如果你想要特定的東西,你應該很清楚,當你告訴編譯器你想要的東西,否則編譯器會進行猜測,並不總是做出你想要的猜測。
對一個微不足道的問題有很好的信息答案。 +1 – 2013-03-18 17:38:07
'f'的意思是浮動' – 2013-03-18 17:05:15
僅僅因爲它編譯並不意味着它具有相同的含義。 – SLaks 2013-03-18 17:05:57
雖然當我使用它時,它似乎做了完全相同的事情:\對我來說,那些不明白的人,它正在做同樣的事情,因此我在問這是怎麼回事。 – user1958850 2013-03-18 17:07:34