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)。
答案 0 :(得分:10)
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;
}