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

C中长双精度的转换说明符,c,mingw,C,Mingw,long double数据类型可以在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

long double数据类型可以在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; 
}
#包括
内部主(空){
长双d=656546.67894L;
printf(“%.0Le\n”,d);
printf(“%.0LE\n”,d);
printf(“%.0Lf\n”,d);
printf(“%.0Lg\n”,d);
printf(“%.0LG\n”,d);
返回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的以下评论,了解解决方法:

\define\u在源文件中使用ANSI标准1
,或将命令行更改为
gcc-D\u使用ANSI标准1


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


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

< P> <强>使用明文W64与体系结构I68(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;
}
这是我的代码:

||=== 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;
}
#包括
#包括
int main()
{
长双a;
scanf(“%Lf”、&a);
printf(“%Lf\n”,a);
返回0;
}

他们似乎都做了我期望的事情。所需的输出是什么?您不会相信这一点,但未能
#include
是未定义的行为,程序可以自由执行任何操作。不过,出于最实际的目的,我敢打赌编译器会为您在include中滑动,您的真实代码中真的有其他东西。对于double,“%.0lf”有什么作用?!对于给定的d,我希望输出为:656547@dirkgently:您没有理解我的意思,我知道隐式声明可能导致的问题,我只发布了一部分。@Gonzalo:我不知道为什么,但我没有得到输出。我知道这一点,我不关心舍入,但我想知道为什么问题会持续很长时间?好的。更新我的答案给你想要的:-)谢谢,那是明的错!有一个解决方法:
#define(定义)在源文件中使用(MINGW)ANSI(STDIO 1)
,或者将命令行更改为
gcc-D(使用)ANSI(STDIO=1)
。不,我使用的MINGW特别版不支持长双精度。我的意思是它给出了与以前相同的错误结果。