在下面的代码中,printf打印-0.00000。问题是什么?如果它是double而不是long double,那么它可以正常工作。
#include<stdio.h>
long double abs1(long double x) {
if (x<0.0)
return -1.0*x;
else
return x;
}
main() {
long double z=abs1(4.1);
printf("%llf\n",z);
}
答案 0 :(得分:9)
长双的正确print format为%Lf
。打开编译器的警告会立即指出错误:
$ gcc -Wall b.c -o b b.c:9: warning: return type defaults to `int' b.c: In function `main': b.c:11: warning: use of `ll' length modifier with `f' type character b.c:11: warning: use of `ll' length modifier with `f' type character b.c:12: warning: control reaches end of non-void function
答案 1 :(得分:4)
long double的C格式化程序是%Lf。另外,有没有理由不使用math.h fabsl()函数而不是滚动自己的绝对值? (请注意,您的绝对值函数会保留零零的符号不变,但这可能与您的目的无关;标准fabsl函数通常也会更快)
答案 2 :(得分:2)
$ gcc -Wall test.c
test.c:9: warning: return type defaults to 'int'
test.c: In function 'main':
test.c:11: warning: use of 'll' length modifier with 'f' type character
test.c:11: warning: use of 'll' length modifier with 'f' type character
test.c:12: warning: control reaches end of non-void function
使用%Lf而不是%llf
答案 3 :(得分:2)
您需要在L
声明中的f
之前使用大写printf
,如下所示:
printf("%Lf\n", z);
我不知道为什么长整数类型的小写和浮点大写。
答案 4 :(得分:0)
您使用的是什么编译器和目标平台?
例如,微软的库不支持long double(但允许使用格式说明符),如果你使用微软的编译器并不重要,因为long double是double的同义词,所以它什么都不会给你带来任何好处。如果你使用MinGW / GCC,你仍然使用微软的C库,但有一个80位长的双倍。在MinGW中,最简单的解决方案是使用C ++的std :: ostream,因为它使用GNU库并支持long double。
或者你可以简单地将它转换为双倍输出。
克利福