C

C 知识量:16 - 74 - 317

3.6 float类型><

浮点类型- 3.6.1 -

面向金融和数学的程序经常会用到浮点数,在C语言中,用于表示浮点数的类型有float、double和long double类型。

浮点数的表示类似于科学计数法,例如:1.14×103。而在计算机中使用指数记数法(即e记数法)来表示,例如:1.14e3。

  • float类型必须至少能表示6位有效数字,取值范围至少是10-37~1037。通常,系统储存一个float浮点数要占用32位,其中8位用于表示指数的值和符号,其余24位用于表示非指数部分及其符号。

  • double类型和float类型的最小取值范围相同,但是,至少必须能表示10位有效数字。通常,double类型占用64位。

  • long double类型至少与double类型有相同的精度,但通常可以满足比double类型更高的精度要求。

声明浮点型变量- 3.6.2 -

浮点型变量的声明和初始化方式与整型变量相同。

float a,b;
double c = 1.324e-5;
long double d = 3.46e32;

浮点型常量- 3.6.3 -

浮点型常量的基本形式是:有符号的数字(包括小数点),后面紧跟e或E,最后是一个有符号数表示10的指数。例如:

6.76E+15
-3.4e-6

其中,6.76E+15中的“+”可以省略,即写作6.76E15。

需要注意的是:

  • 可以没有小数点或指数部分,但是不能同时省略两者。

  • 可以省略小数部门或整数部门,但是不能同时省略两者。

默认情况下,编译器假定浮点型常量是double类型。在浮点数后面加上f或F后缀可以覆盖默认设置,编译器将按照float类型处理。使用l或L后缀可以将常量设置为long double类型。

打印浮点值- 3.6.4 -

printf()函数使用%f转换说明来打印十进制记数法的float和double类型浮点数,用%e打印指数记数法的浮点数,用%Lf和%Le打印long double类型的浮点数。

#include <stdio.h>

int main(void) {
    float a = 1.4;
    double b = 3.14e9;
    long double c = 9.32e-4;
    
    printf("a is:%f\n", a);
    printf("b is:%e\n", b);
    printf("c is:%Lf\n", c);
    
    return 0;
}

运行的结果为:

a is:1.400000
b is:3.140000e+009
c is:0.000932

浮点值的溢出- 3.6.5 -

浮点值的溢出分为:上溢和下溢。

  • 上溢:当计算导致数字过大,超出当前类型能表达的范围时,就会发生上溢。这时会给变量赋一个表示无穷大的特定值,使用printf()函数打印时会显示inf。

  • 下溢:当一个值过小,超出当前类型能表达的范围时,就会发生下溢。这时会损失原末尾有效位上的数字,甚至会导致所有位全部为0。

#include <stdio.h>

int main(void) {
    float a = 1.4e40 * 100.0f;
    double b = 3.14e-6;
    double c = 3.14e-9;
    
    printf("a is:%f\n", a);
    printf("b is:%f\n", b);
    printf("c is:%f\n", c);
    
    return 0;
}

运行的结果为:

a is:inf
b is:0.000003
c is:0.000000