C中long double的转换说明符

时间:2009-11-19 15:59:06

标签: c mingw

long double 数据类型可以在C中包含这些转换说明符:%Le,%LE,%Lf,%Lg,%LG(reference)。

我写了一个小程序来测试:

#include <stdio.h>
int main(void) {
  long double d = 656546.67894L;
  printf("%.0Le\n",d);
  printf("%.0LE\n",d);
  printf("%.0Lf\n",d);
  printf("%.0Lg\n",d);
  printf("%.0LG\n",d);
  return 0; 
}

输出:

-0

-4E-153

-0

-4E-153

-4E-153

但没有人提供所需的输出,即656547(你可能很容易理解)。是什么原因?

使用的编译器是gcc版本3.4.2(mingw-special)。

3 个答案:

答案 0 :(得分:10)

来自old mingw wiki

  

mingw使用Microsoft C运行时   图书馆及其实施   printf不支持'long   双'型。作为解决方案,你   可以投两个'并且通过那个   而不是printf。例如:

printf("value = %g\n", (double) my_long_double_value);
  

注意一个   “长期”存在类似的问题   类型。使用'I64'(眼睛六十四)   长度修饰符而不是gcc的'll'   (ell)。例如:

printf("value = %I64d\n", my_long_long_value);

编辑(6年后):另请参阅以下Keith Thompson的评论:

  源文件中的

#define __USE_MINGW_ANSI_STDIO 1或将命令行更改为gcc -D__USE_MINGW_ANSI_STDIO=1

答案 1 :(得分:1)

MinGW C库由MSVCRT.DLL提供,它随Windows一起提供,实际上是旧的VC ++ 6.0库。

但是,MinGW确实使用了GNU C ++库,虽然它依赖于底层的C库,但它确实支持使用iostreams输出的long double。即使您不希望一般使用C ++,也可能值得使用足以支持此功能。

答案 2 :(得分:0)

将MinGW-W64与架构i686(x86-64无法使用)一起使用可能是一种解决方案。我尝试了一下,就行了。

以下是编译信息:

||=== Build: Debug in TeaErr (compiler: GNU GCC Compiler) ===|
D:\Practice\TeaErr\main.c||In function 'main':|
D:\Practice\TeaErr\main.c|7|warning: unknown conversion type character 'L' in format [-Wformat=]|
D:\Practice\TeaErr\main.c|7|warning: too many arguments for format [-Wformat-extra-args]|
D:\Practice\TeaErr\main.c|7|warning: unknown conversion type character 'L' in format [-Wformat=]|
D:\Practice\TeaErr\main.c|7|warning: too many arguments for format [-Wformat-extra-args]|
D:\Practice\TeaErr\main.c|8|warning: unknown conversion type character 'L' in format [-Wformat=]|
D:\Practice\TeaErr\main.c|8|warning: too many arguments for format [-Wformat-extra-args]|
D:\Practice\TeaErr\main.c|8|warning: unknown conversion type character 'L' in format [-Wformat=]|
D:\Practice\TeaErr\main.c|8|warning: too many arguments for format [-Wformat-extra-args]|
||=== Build finished: 0 error(s), 8 warning(s) (0 minute(s), 1 second(s)) ===|

这些是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    long double a;
    scanf("%Lf",&a);
    printf("%Lf\n",a);
    return 0;
}

Result Some Parameters on Install MinGW-W64