2011-08-25 25 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库(例如,如果我没有弄错的话,那么微软)。 –