如何打印最大可能的浮点数并在C中加倍?

use*_*651 2 c floating-point double printf limits

对于以下代码,

#include <stdio.h>
#include <limits.h>
#include <float.h>

int main(void) {
    printf("double max = %??\n", DBL_MAX);
    printf("double min = %??\n", DBL_MIN);
    printf("double epsilon  = %??\n", DBL_EPSILON);
    printf("float epsilon  = %??\n", FLT_EPSILON);
    printf("float max = %??\n", FLT_MAX);
    printf("float min = %??\n\n", FLT_MIN);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为了让printf将各种数量显示为适当大小的十进制数,我必须使用哪些说明符代替??

Kei*_*son 5

使用与这些类型的任何其他值相同的格式:

#include <float.h>
#include <stdio.h>
int main(void) {
    printf("FLT_MAX = %g\n", FLT_MAX);
    printf("DBL_MAX = %g\n", DBL_MAX);
    printf("LDBL_MAX = %Lg\n", LDBL_MAX);
}
Run Code Online (Sandbox Code Playgroud)

类型的参数float都提升到double可变参数的功能,如printf,这就是为什么你使用相同的格式两者.

%f 使用没有指数的十进制表示法打印浮点值,这将为非常大的值提供非常长的字符串(通常是无关紧要的).

%e 强制使用指数.

%g使用%f或者%e,取决于打印数量的大小.

在我的系统上,上面打印如下:

FLT_MAX = 3.40282e+38
DBL_MAX = 1.79769e+308
LDBL_MAX = 1.18973e+4932
Run Code Online (Sandbox Code Playgroud)

正如Eric Postpischil在评论中指出的那样,上面仅打印了值的近似值.您可以通过指定精度来打印更多数字(您需要的位数取决于类型的精度); 例如,您可以替换%g%.20g.

或者,如果您的实现支持它,C99添加了以十六进制格式打印浮点值的能力,并且必要时具有尽可能高的精度:

printf("FLT_MAX = %a\n", FLT_MAX);
printf("DBL_MAX = %a\n", DBL_MAX);
printf("LDBL_MAX = %La\n", LDBL_MAX);
Run Code Online (Sandbox Code Playgroud)

但结果并不像通常的十进制格式那样易于阅读:

FLT_MAX = 0x1.fffffep+127
DBL_MAX = 0x1.fffffffffffffp+1023
LDBL_MAX = 0xf.fffffffffffffffp+16380
Run Code Online (Sandbox Code Playgroud)

(注意:main()是一个过时的定义;请int main(void)改用.)