Printf长双,未知转换类型字符L.

时间:2016-12-20 13:24:45

标签: c++ windows gcc gcc-warning

我的程序非常简单:

#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
    long double a = 4.5;
    printf("%Lg", a);
    return 0;
}

编译时,有一个警告:

warning: unknown conversion type character 'L' in format [-Wformat=]|

控制台中的输出是

-1.28823e-231

关于打印长双打的文档很清楚,它只是说明这种格式的正确参数是L.我做错了什么?我在Windows 10下使用了代码块,mingw32-g ++编译器。

P.S。:cout产生相同的输出。

1 个答案:

答案 0 :(得分:2)

您遇到编译问题:

  

mingw使用Microsoft C运行时库,它们的printf实现不支持'long double'类型。作为解决方法,你可以强制转换为'double'并将其传递给printf。

因此,您需要double double

  

在x86架构上,大多数C编译器实现long double作为x86硬件支持的80位扩展精度类型(有时存储为12或16字节以保持数据结构对齐),如C99 / C11标准中所规定的( IEC 60559浮点运算(附件F))。一个例外是用于x86的Microsoft Visual C ++,它使long double成为double的同义词。[2] Microsoft Windows上的英特尔C ++编译器支持扩展精度,但需要/ Qlong-double开关用于long double,以对应硬件的扩展精度格式。[3]

而不是printf(),请使用std::cout加上std::scientific,例如:

#include  <iostream>
std::cout << "scientific: " << std::endl << std::scientific << a;

最好不要在同一个项目中同时使用stdio.hiostream,因为它们有时会相互干扰。

PS。关于这个主题,还有:std::hexstd::dec(十进制),std::boolalpha(真,假)等等。