长双精度、未知转换类型字符 L 的 printf
Posted
技术标签:
【中文标题】长双精度、未知转换类型字符 L 的 printf【英文标题】:Printf of long double, unknown conversion type character L 【发布时间】:2016-12-20 13:24:45 【问题描述】:我的程序很简单:
#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 产生相同的输出。
【问题讨论】:
gcc 6.2.1 没有问题。也许这个编译器不支持long double
转换为printf
。您可以通过实际编写 C++ 代码而不是 C 代码并使用 <<
运算符来避免此问题。
您的代码编译良好。我编译它并且输出是正确的。尝试使用不同的编译器
【参考方案1】:
你有一个编译器问题:
mingw 使用 Microsoft C 运行时库,并且它们的 printf 实现不支持“long double”类型。作为一种解决方法,您可以转换为 'double' 并将其传递给 printf。
因此,你需要double double
:
在 x86 体系结构上,大多数 C 编译器将 long double 实现为 x86 硬件支持的 80 位扩展精度类型(有时存储为 12 或 16 字节以保持数据结构对齐),如 C99 / C11 标准( IEC 60559 浮点运算(附件 F))。一个例外是 Microsoft Visual C++ for x86,它使 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
(真、假)等。
【讨论】:
@user16320 科学:4.500000e+00 是程序的输出,在 cpp.sh 上使用 cpp11 标志进行了测试。你使用的是什么 c++ 标志? 什么是 c++ 标志?我正在使用代码块。我是菜鸟。我什至不能使用命令行。 好的,我安装了其他一些名为 mingw w64 的编译器,它甚至可以使用 cout。问题解决了。 @user16320 如果您对自己遇到问题的原因感到好奇,请查看编辑。以上是关于长双精度、未知转换类型字符 L 的 printf的主要内容,如果未能解决你的问题,请参考以下文章