2012-07-12 66 views
1

在C++中總是使用後綴'f'作爲浮點數的優點嗎?任何總是使用後綴'f'在C++中使用浮點數的優點?

從一方面我的代碼變得混亂,我的意思是我有很多數學公式 和想象而不是寫簡單1,寫1.0f。它會混亂 的代碼。

但我想知道是否有優化或其他方面呢?

由於

+2

1是int,1.0是double,1.0f是float。 – PlasmaHH 2012-07-12 16:36:11

+0

'1.f'或者甚至只是'1.',使它成爲浮點計算的雙精度,而不是整數運算。 – Xeo 2012-07-12 16:36:18

+0

'1.0f'會浮動,'1.0'會翻倍。據我所知,沒有優勢。 – adelbertc 2012-07-12 16:37:04

回答

0

1.01.double恆定

1.0ffloat恆定

是有區別的。

0

它可以消除警告。

順便說一句,取決於你的編譯器,場景後面的浮動被提升爲雙倍計算。

+0

或者兩者都可能被提升爲更大的類型。 – 2012-07-12 16:41:15

1

編譯器幾乎可以確定它,因此不存在運行時性能損失。

要明確的原因是爲了避免關於隱式轉換的編譯器警告,避免可能意外行爲的轉換,以及在類型演繹上下文中推導特定類型或強制調用特定的過載。

這裏就是源所要表達的值作爲分數的例子,但得到了錯誤的值,因爲文字是錯誤的類型:

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); 
    ^
4

有時它變成必要

考慮這個函數模板:

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.0double1.0ffloat

+0

而這位親愛的朋友本來是介紹std :: identity模板的絕好機會,但是在C++ 0x期間這個模板已經被移除了,但是會很好地解決這種和類似的情況。多可惜... – PlasmaHH 2012-07-12 21:19:42

0

另一個用於指定double與float的用法是FORTRAN的遺留問題,它可能會或可能不會困擾您的編譯器。在過去的幾天裏,FORTRAN只會將數據存儲到您指定的精度,並將垃圾以未指定的字節數保留在最後一位數字之外。編碼x = 1是完全可能的。0並且x的確等於1.0987659987623,這取決於「x」的類型(在FORTRAN中它將是單精度浮點數)。