C ++:“float”的printf()格式规范是什么?

时间:2011-08-25 21:43:34

标签: c++ visual-c++ format printf

C ++:printf()的{​​{1}}格式规范是什么? (Visual C ++)

以前我使用float %gfloat使用%lg

规格似乎已更改且double未定义且floatdouble

我在内存中有一些内容正在打印出来,因此无法进行投射。

我是否可以使用%g打印float个值?

更新

此代码是为在嵌入式系统上使用的通用C ++库的单元测试而编写的。 以下是让printf()工作所必须做的事情。 代码在模板函数中:

float

以下是代码片段:

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

非常丑陋不是吗?使用浮点数作为args会产生不良输出。也许是因为使用了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(),这样就行了。不再了。

6 个答案:

答案 0 :(得分:17)

double和float使用与printf%a%e%f%g相同的格式说明符。这是因为printf是一个可变函数。在调用之前,任何浮点参数都会被隐式提升为double;你实际上无法将浮动传递给printf

答案 1 :(得分:4)

标题中的问题:没有/“%f”

对于邮件正文中的问题:是和否。

printf是一个可变函数。所有float个参数都会自动提升为double个。您通过将浮点数传递给printf来打印浮点数,但实际上没有浮点数到达printf函数。

答案 2 :(得分:3)

%g一直是float或double的正确格式(因为对于像printf这样的可变函数,float参数被提升为double。

%lg被添加为%g的同义词(在C99中,我不知道C ++何时或是否采用它),可能是为了更好地与*scanf系列对称。 / p>

$Lg是长篇大论。

您可以使用上面的gf替换e,具体取决于您想要的输出格式。

答案 3 :(得分:2)

来自:http://www.cplusplus.com/reference/clibrary/cstdio/printf/

%f十进制浮点数392.65

答案 4 :(得分:2)

其他人已经指出了使用printf打印浮动的格式,但是,由于您使用的是C ++,我的建议是完全避免这种情况。

使用C ++流,您不必担心格式说明符。它也是类型安全的,而printf则不是。

#include <iostream>

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

如果你有一个包含float的字节数组,memcpy将它放入float变量并使用上面的代码。

答案 5 :(得分:1)

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

或者如果你想要指数表示法:

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