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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7197589/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 16:35:30  来源:igfitidea点击:

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

c++visual-c++formatprintf

提问by Michael Fitzpatrick

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

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

It used to be that I used %gfor floatand %lgfor double.

它曾经是我用%gfloat%lgdouble

It looks like the spec changed and floatis undefined and doubleis %g.

看起来规范已更改并且float未定义并且double%g.

I have bits in memory that I am printing out so casting is not an option.

我的内存中有一些要打印出来,所以不能选择强制转换。

Is there a way that I can print out floatvalues using printf()?

有没有办法可以float使用打印出值printf()

Update:

更新:

This code was written for unit testing generic C++ libs used on an embedded system. Here's what I had to do to get the floatto work. The code is in a template function:

此代码是为在嵌入式系统上使用的通用 C++ 库进行单元测试而编写的。这是我必须做的事情float才能正常工作。代码在模板函数中:

template <typename T,typename TTYP,typename Ttyp,int bits,bool IsSigned> 
Error testMatrixT() 
{ ...

Here is a code snip:

这是一个代码片段:

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 {
    ...

Pretty ugly isn't it? Using floats as args give bad output. Maybe due to using _snprintf()? Years ago I would use %lgand it would be OK. Not anymore.

很丑是不是?使用浮点数作为参数会产生错误的输出。可能是因为使用_snprintf()?几年前我会使用%lg它会没事的。不再。

回答by Stephen Canon

double and float use the same format specifiers with printf(%a, %e, %f, and %g). This is because printfis a variadic function. Any float arguments are implicitly promoted to double before the call; you can't actually pass a float to printf.

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

回答by eq-

To the question in title: There is none / "%f"

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

To the question in message body: Yes and no.

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

printfis a variadic function. All floatarguments are automatically promoted to doubles. You print a float by passing it to printf, but no float actually reaches the printf function.

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

回答by Keith Thompson

%ghas always been the correct format for either float or double (since float arguments are promoted to double for variadic functions like printf).

%g一直是 float 或 double 的正确格式(因为 float 参数被提升为 double 之类的可变参数函数printf)。

%lgwas added as a synonym for %g(in C99, I don't know when or whether C++ adopted it), probably for better symmetry with the *scanffamily.

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

$Lgis for long double.

$Lg是长双。

You can replace gwith for ein the above, depending on what output format you want.

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

回答by Kiley Naro

From: http://www.cplusplus.com/reference/clibrary/cstdio/printf/

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

%f Decimal floating point 392.65

%f 十进制浮点数 392.65

回答by Praetorian

Others have pointed out the format for printing float using printf, but, since you're using C++, my suggestion is to avoid this completely.

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

Use C++ streams instead, you don't have to worry about format specifiers then. It is also type safe, while printfisn't.

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

#include <iostream>

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

If you have an array of bytes containing a float, memcpyit into a float variable and use the above code.

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

回答by SSteve

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

or if you want exponential notation:

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

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