在C++中總是使用後綴'f'作爲浮點數的優點嗎?任何總是使用後綴'f'在C++中使用浮點數的優點?
從一方面我的代碼變得混亂,我的意思是我有很多數學公式 和想象而不是寫簡單1,寫1.0f。它會混亂 的代碼。
但我想知道是否有優化或其他方面呢?
由於
在C++中總是使用後綴'f'作爲浮點數的優點嗎?任何總是使用後綴'f'在C++中使用浮點數的優點?
從一方面我的代碼變得混亂,我的意思是我有很多數學公式 和想象而不是寫簡單1,寫1.0f。它會混亂 的代碼。
但我想知道是否有優化或其他方面呢?
由於
1.0
或1.
是double
恆定
1.0f
是float
恆定
是有區別的。
它可以消除警告。
順便說一句,取決於你的編譯器,場景後面的浮動被提升爲雙倍計算。
或者兩者都可能被提升爲更大的類型。 – 2012-07-12 16:41:15
編譯器幾乎可以確定它,因此不存在運行時性能損失。
要明確的原因是爲了避免關於隱式轉換的編譯器警告,避免可能意外行爲的轉換,以及在類型演繹上下文中推導特定類型或強制調用特定的過載。
這裏就是源所要表達的值作爲分數的例子,但得到了錯誤的值,因爲文字是錯誤的類型:
float a = 3/4; // produces 0.0f instead of 0.75f
這裏引起的隱式轉換的警告:
tmp.cpp:4:15: warning: implicit conversion loses floating-point precision:
'double' to 'float' [-Wconversion]
float a = 0.1;
~ ^~~
這裏是造成不是具體的曖昧過載故障的情況:
tmp.cpp:6:5: error: call to 'foo' is ambiguous
foo(1);
^~~
tmp.cpp:2:6: note: candidate function
void foo(unsigned char a);
^
tmp.cpp:3:6: note: candidate function
void foo(float b);
^
有時它變成必要。
考慮這個函數模板:
template<typename T>
void f(T a, T b);
float get_value(); //consider this too!
現在看到這一點:
f(get_value(), 1); //compilation error
f(get_value(), 1.0); //compilation error
f(get_value(), 1.0f); //okay
在前兩個電話,模板參數推導失敗,所以他們不進行編譯。在ideone處查看錯誤。
注意的1
類型是int
,並1.0
是double
而1.0f
是float
。
而這位親愛的朋友本來是介紹std :: identity模板的絕好機會,但是在C++ 0x期間這個模板已經被移除了,但是會很好地解決這種和類似的情況。多可惜... – PlasmaHH 2012-07-12 21:19:42
另一個用於指定double與float的用法是FORTRAN的遺留問題,它可能會或可能不會困擾您的編譯器。在過去的幾天裏,FORTRAN只會將數據存儲到您指定的精度,並將垃圾以未指定的字節數保留在最後一位數字之外。編碼x = 1是完全可能的。0並且x的確等於1.0987659987623,這取決於「x」的類型(在FORTRAN中它將是單精度浮點數)。
1是int,1.0是double,1.0f是float。 – PlasmaHH 2012-07-12 16:36:11
'1.f'或者甚至只是'1.',使它成爲浮點計算的雙精度,而不是整數運算。 – Xeo 2012-07-12 16:36:18
'1.0f'會浮動,'1.0'會翻倍。據我所知,沒有優勢。 – adelbertc 2012-07-12 16:37:04