视觉C++:"float"的 printf() 格式规范是什么?

visual C++: What is the printf() format spec for "float"?

本文关键字:格式 是什么 printf C++ float 视觉      更新时间:2023-10-16

C++:floatprintf()格式规范是什么?(Visual C++(

以前我用%g代替float,用%lg代替double

看起来规范发生了变化,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,它会没事的。现在不行了。

double和float使用与printf(%a%e%f%g(相同的格式说明符。这是因为printf是一个变差函数。在调用之前,任何浮点参数都会隐式提升为双精度;实际上不能将浮点值传递给printf

对于标题中的问题:没有/"%f">

对于消息正文中的问题:是和否

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

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

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

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

如果您有一个包含浮点的字节数组,请将其memcpy转换为一个浮点变量,并使用上面的代码。

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

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

$Lg代表长双。

您可以在上面用fe替换g,具体取决于您想要的输出格式。

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

%f十进制浮点392.65

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

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

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