【问题标题】:Printf of long double, unknown conversion type character L长双精度、未知转换类型字符 L 的 printf
【发布时间】: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; 运算符来避免此问题。
  • 您的代码编译良好。我编译它并且输出是正确的。尝试使用不同的编译器

标签: c++ windows gcc gcc-warning


【解决方案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 如果您对自己遇到问题的原因感到好奇,请查看编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
相关资源
最近更新 更多