C ++:printf()
的{{1}}格式规范是什么? (Visual C ++)
以前我使用float
%g
而float
使用%lg
。
规格似乎已更改且double
未定义且float
为double
。
我在内存中有一些内容正在打印出来,因此无法进行投射。
我是否可以使用%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()
,这样就行了。不再了。
答案 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
是长篇大论。
您可以使用上面的g
或f
替换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);