C++ 长双精度未知转换类型字符L的Printf
我的程序非常简单:C++ 长双精度未知转换类型字符L的Printf,c++,windows,gcc,gcc-warning,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; } 控制台中的输出是 -1.28823e-231 文档对打印长双精度非常清楚,它简单地说明了此格式的正确参数是L。我做错了什么?我使用的是Windows10下的代码块,mingw3
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
long double a = 4.5;
printf("%Lg", a);
return 0;
}
控制台中的输出是
-1.28823e-231
文档对打印长双精度非常清楚,它简单地说明了此格式的正确参数是L。我做错了什么?我使用的是Windows10下的代码块,mingw32-g++编译器
注意:cout产生相同的输出。您有一个编译器问题: mingw使用Microsoft C运行时库,它们的printf实现不支持“long double”类型。作为一种变通方法,您可以将其转换为“double”,并将其传递给printf 因此,您需要
double-double
:
按照C99/C11标准(IEC 60559浮点算术(附录F))的规定,在x86体系结构上,大多数C编译器实现长双精度,作为x86硬件支持的80位扩展精度类型(有时存储为12或16字节以保持数据结构对齐)。一个例外是微软Visual C++为X86,这使得长双是同义词。(2)微软Windows上的英特尔C++编译器支持扩展精度,但是需要/Qlong双开关长双倍以对应硬件的扩展精度格式。[3 ] < /P>
不要使用printf()
,而应使用std::cout
并结合使用,例如:
#include <iostream>
std::cout << "scientific: " << std::endl << std::scientific << a;
#包括
标准::gcc 6.2.1没有问题。可能此编译器不支持printf
的long-double
转换。你可以通过写C++代码而不是C代码来避免这个问题,并且使用<代码>你的代码编译得很好。我编译了它,输出是正确的。尝试使用不同的compiler@user16320科学:4.500000e+00是程序的输出,使用cpp11标志在cpp.sh上测试。你使用什么C++标志?什么是C++标志?我用的是代码块。我是个笨蛋。我甚至不能使用命令行。好吧,我安装了另一个名为mingw64的编译器,它甚至可以与cout一起工作。问题已解决。@user16320如果您是好奇型的人,请参阅编辑,了解您为什么会遇到问题。
#include <iostream>
std::cout << "scientific: " << std::endl << std::scientific << a;