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

Posted

技术标签:

【中文标题】C++:“float”的 printf() 格式规范是啥?【英文标题】:C++: What is the printf() format spec for "float"?C++:“float”的 printf() 格式规范是什么? 【发布时间】:2011-08-25 21:43:34 【问题描述】:

C++:printf()float 格式规范是什么? (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,这样就可以了。没有了。

【问题讨论】:

这是我在这么多天里看到的关于打印花车的第三或第四个问题! 你没有提到如果你使用 %g 会发生什么。但是 %g 无论如何都不是 float 的默认值。 @steve: %g 适用于 float,因为它被提升为 double。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

$Lg 用于长双精度。

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

【讨论】:

在许多系统上,C++ 使用与 C 相同的运行时,因此如果 C 库使用 C99 标准,C++ 也是如此。 @user877329: 是的——但仍然有不支持 C99 的 C 库(例如微软,如果我没记错的话)。【参考方案4】:

发件人:http://www.cplusplus.com/reference/clibrary/cstdio/printf/

%f 十进制浮点数 392.65

【讨论】:

【参考方案5】:

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

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

#include <iostream>

int main()

  float f = 1.234;
  std::cout << f << std::endl;

如果您有一个包含浮点数的字节数组,请将memcpy 放入浮点变量并使用上述代码。

【讨论】:

我最终使用了流,但我认为这是一个临时解决方案,因为我确信我们最终会在没有 STL 支持的嵌入式平台上运行它。在我看来,浮点数已被弃用,因为它没有格式规范,并且除非我将其转换为双精度,否则它不能作为 printf 的参数。【参考方案6】:
printf("float: %f", floatValue);

或者如果你想要指数符号:

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

【讨论】:

或者如果你想要定点或指数:printf("float: %g", floatValue);

以上是关于C++:“float”的 printf() 格式规范是啥?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 从 4*float 格式上传像素数据(C++)

printf 和 fprintf 在c 和c++中的使用。

C语言中printf输出float和double都用%f么(scanf又如何)

printf的格式

c++中如何输出保留三位小数的浮点数

c++编程中语句太长如何换行