[英]C++: What is the printf() format spec for “float”?
C ++: float
的printf()
格式规范是什么? (Visual C ++)
过去,我使用%g
表示float
, %lg
表示double
。
它看起来像spec改变了, 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 {
...
相当丑陋不是吗? 使用浮点数作为args会产生不良输出。 也许是因为使用_snprintf()
? 几年前我会使用%lg
,它会没问题。 不再。
double和float使用与printf
( %a
, %e
, %f
和%g
)相同的格式说明符。 这是因为printf
是一种可变函数。 在调用之前,任何浮点参数都会被隐式提升为double; 你实际上不能将float传递给printf
。
标题中的问题:没有/“%f”
对于消息体中的问题:是和否。
printf
是一种可变函数。 所有float
参数都会自动提升为double
。 您通过将浮点数传递给printf来打印浮点数,但实际上没有浮点数到达printf函数。
%g
一直是漂浮或双(因为浮动参数都提升到一倍像可变参数函数的正确格式printf
)。
%lg
被添加为%g
的同义词(在C99中,我不知道C ++何时或是否采用它),可能是为了更好地与*scanf
系列对称。
$Lg
是长双。
您可以在上面用f
或e
替换g
,具体取决于您想要的输出格式。
来自: http : //www.cplusplus.com/reference/clibrary/cstdio/printf/
%f十进制浮点数392.65
其他人已经指出了使用printf
打印float的格式,但是,由于你使用的是C ++,我的建议是完全避免这种情况。
相反,使用C ++流,您不必担心格式说明符。 它也是类型安全的,而printf
则不是。
#include <iostream>
int main()
{
float f = 1.234;
std::cout << f << std::endl;
}
如果你有一个包含float的字节数组,请将它memcpy
到float变量中并使用上面的代码。
printf("float: %f", floatValue);
或者如果你想要指数表示法:
printf("float: %e", floatValue);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.