C中长双精度的转换说明符

C中长双精度的转换说明符,c,mingw,C,Mingw,长双精度数据类型可以在C中包含这些转换说明符:%Le、%Le、%Lf、%Lg、%Lg 我编写了一个小程序来测试: #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); r

长双精度数据类型可以在C中包含这些转换说明符:%Le、%Le、%Lf、%Lg、%Lg

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

#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。

来自:

mingw使用microsoftc运行时 图书馆及其信息技术的实施 printf不支持“long” “双”型。作为一个工作环境,你 可以投到“双倍”并通过 改为printf。例如:

请注意 “长期”也存在类似的问题 类型使用“I64”眼64 长度修饰符,而不是gcc的'll' 嗯,嗯。例如:

6年后编辑:另请参阅Keith Thompson的以下评论,了解解决方法:

在源文件中定义uuu USE_MINGW_ANSI_STDIO 1,或将命令行更改为gcc-D_uuuse_MINGW_ANSI_STDIO=1


MinGW C库是由MSVCRT.DLL提供的,它是Windows附带的,实际上是旧的VC++6.0库

MIWW不过使用GNU C++库,尽管依赖于底层C库,但它支持使用IoSokes输出的长双倍。即使您不希望使用C++,也可以使用足够的支持这个能力。

使用明文W64与体系结构I68 6x8664不能工作,也许是解决方案。我试过了,效果很好

以下是编译信息:

以下是我的代码:


他们似乎都做了我期望的事情。期望的输出是什么?你不会相信这一点,但是不包含是未定义的行为,程序可以自由地做任何事情。不过,出于最实际的目的,我敢打赌编译器会为您滑入include,而您的真实代码中确实还有其他内容。对于double,%.0lf做什么?!对于给定的d,我希望输出为:656547@dirkgently:您没有理解我的意思,我知道隐式声明可能导致的问题,我只发布了一部分。@Gonzalo:我不知道为什么,但我没有得到输出。我知道这一点,我不关心舍入,但我想知道为什么问题会持续很长时间?好的。更新我的答案,给你你想要的:-谢谢,那是明的错!有一个解决方法:在源文件中定义uu USE_MINGW_ANSI_STDIO 1,或者将命令行更改为gcc-D_uuse_MINGW_ANSI_STDIO=1。不,我使用的MINGW特别版不支持长双精度。我的意思是它给出了与以前相同的错误结果。
printf("value = %g\n", (double) my_long_double_value);
printf("value = %I64d\n", my_long_long_value);
||=== 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;
}