C中的长双数据类型问题

时间:2009-09-24 16:46:31

标签: c

在下面的代码中,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);
}

5 个答案:

答案 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。

或者你可以简单地将它转换为双倍输出。

克利福

相关问题