我的程序非常简单:
#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产生相同的输出。
答案 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.h
和iostream
,因为它们有时会相互干扰。
PS。关于这个主题,还有:std::hex
,std::dec
(十进制),std::boolalpha
(真,假)等等。