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

12
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 时还好,但现在不行了。

1
这是我在过去几天里看到的第三或第四个关于打印浮点数的问题! - Praetorian
你没有提到如果使用%g会发生什么。但是%g不是浮点数的默认值。 - steve
1
@steve:%g适用于浮点数,因为它被提升为双精度。 - Keith Thompson
6个回答

25

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


4

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

对于正文中的问题:是和不是。

printf 是一个可变参数函数。所有的 float 参数都会自动转换为 double。通过将 float 传递给 printf 来打印它,但实际上并没有传递 float 给 printf 函数。


3

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

使用C++流代替,然后就不必担心格式说明符了。而且它是类型安全的,而printf则不是。

#include <iostream>

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

如果您有一个包含浮点数的字节数组,将其使用memcpy复制到一个浮点变量中,并使用上述代码。

我最终使用了流,但我认为这只是一个临时解决方案,因为我确定我们最终会在不支持STL的嵌入式平台上运行它。在我看来,浮点数已经被弃用了,因为它没有格式规范,并且除非我将其转换为双精度,否则它不能作为printf的参数。 - Michael Fitzpatrick

3

%g一直是浮点数或双精度的正确格式(因为对于像printf这样的可变参数函数,浮点参数会被提升为双精度)。

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

$Lg是用于长双精度。

您可以根据所需的输出格式将上述g替换为fe


在许多系统上,C++ 使用与 C 相同的运行时库,因此如果 C 库使用 C99 标准,C++ 也会使用。 - user877329
@user877329:没错,但仍有一些C库不支持C99(例如微软,如果我没记错的话)。 - Keith Thompson

2

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

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接