2011-08-25 29 views
6

C++:floatprintf()格式規格是什麼? (Visual C++)C++:「float」的printf()格式規範是什麼?

它曾經是我用%gfloat%lgdouble

它看起來像規範改變和float未定義和double%g

我有內存中的位,我打印出來,所以鑄件不是一個選項。

有沒有一種方法可以使用printf()打印出float值?

更新:

此代碼爲單位測試的嵌入式系統上使用的通用C++庫被寫入。 以下是我必須要做的事情才能讓float正常工作。 的代碼是一個模板函數:

template <typename T,typename TTYP,typename Ttyp,int bits,bool IsSigned> 
Error testMatrixT() 
{ ... 

下面是一個代碼剪斷:

if (typeid(Ttyp) == typeid(float)) {  
    float64 c = *(float32*)&Tp(row,col); 
    float64 a1 = *(float32*)&Arg1(row,col); 
    float64 a2 = *(float32*)&Arg2(row,col); 
    float64 e = *(float32*)&Exp(row,col); 
    m_b = (c == e); 
    _snprintf(m_acDiag, sizeof(m_acDiag)-1 
     , "add(Arg1,Arg2): arg1=%g, arg2=%g, Expected=%g, Actual=%g, Result: %s" 
     , a1, a2, e, c, BOOL_PF(m_b)); 
} else { 
    ... 

很醜陋,不是嗎?使用浮點數作爲參數會導致錯誤的輸出。也許由於使用_snprintf()? 年前,我會使用%lg,這將是確定的。不再。

+1

這是我見過的第三或第四個問題,在很多天裏,關於印刷浮法! – Praetorian

+0

你沒有提到如果你使用%g會發生什麼。但%g不是浮動的默認值。 – steve

+1

@steve:'%g'適用於float,因爲它被提升爲double。 –

回答

16

double和float使用與printf相同的格式說明(%a%e%f%g)。這是因爲printf是一個可變參數函數。在調用之前,任何浮點參數都會隱式提升爲double;你實際上不能傳遞一個浮點數到printf

1
printf("float: %f", floatValue); 

,或者如果你想指數形式:

printf("float: %e", floatValue); 
+0

或者如果你想要定點或指數:'printf(「float:%g」,floatValue);' –

4

要在標題中的問題:有沒有/「%F」

要在郵件正文中的問題:是的,沒有。

printf是一個可變參數函數。所有float參數自動提升爲double s。您通過將float傳遞給printf來打印float,但實際上float沒有達到printf函數。

1

其他人指出了使用printf打印float的格式,但是,由於您使用的是C++,我的建議是完全避免這種情況。

改爲使用C++流,您不必擔心格式說明符。它也是類型安全的,而printf不是。

#include <iostream> 

int main() 
{ 
    float f = 1.234; 
    std::cout << f << std::endl; 
} 

如果有含有浮標,memcpy它變成一個浮子可變字節數組,並使用上面的代碼。

+0

我最終使用了流,但我認爲這是一個臨時解決方案,因爲我確信我們最終會運行這個在沒有STL支持的嵌入式平臺上。它在我看來,浮動已被棄用,因爲它沒有格式規範,並且它不能作爲printf的arg,除非我將它轉換爲double。 –

1

%g對於float或double都是正確的格式(因爲浮點參數被提升爲可變參數函數的兩倍,如printf)。

%lg被添加爲%g(在C99中,我不知道C++是否採用它)的同義詞,可能是爲了更好地與*scanf系列對稱。

$Lg是長雙倍。

您可以用fe替換g,這取決於您想要的輸出格式。

+0

在許多系統上,C++使用與C相同的運行時,所以如果C庫使用C99標準,那麼C++也是如此。 – user877329

+0

@ user877329:正確 - 但仍然存在不支持C99的C庫(例如,如果我沒有弄錯的話,那麼微軟)。 –