长双精度、未知转换类型字符 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 代码并使用 &lt;&lt; 运算符来避免此问题。 您的代码编译良好。我编译它并且输出是正确的。尝试使用不同的编译器 【参考方案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.hiostream,因为它们有时会相互干扰。

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

【讨论】:

@user16320 科学:4.500000e+00 是程序的输出,在 cpp.sh 上使用 cpp11 标志进行了测试。你使用的是什么 c++ 标志? 什么是 c++ 标志?我正在使用代码块。我是菜鸟。我什至不能使用命令行。 好的,我安装了其他一些名为 mingw w64 的编译器,它甚至可以使用 cout。问题解决了。 @user16320 如果您对自己遇到问题的原因感到好奇,请查看编辑。

以上是关于长双精度、未知转换类型字符 L 的 printf的主要内容,如果未能解决你的问题,请参考以下文章

第五章 C程序结构

c学习 - 数据类型运算符与表达式

C语言实型常量

java基本数据类型的细节和转换

java基本数据类型的细节和转换

将列的数据类型从字符串转换为双精度