【2023最新】C语言教程
文章目录
第3章 数据和C
3.4 C语言基本数据类型
3.4.6 float、double和long double
C语言中的浮点类型有float、double和long double类型。
浮点类型可以表示小数在内的更大范围的数,浮点数的表示类似于科学计数法(即用小数乘以10 的幂来表示数字)
数字 | 科学计数法 | 指数计数法 |
---|---|---|
1000000000 | 1.0 X 1 0 9 10^9 109 | 1.0e9 |
123000 | 1.23 X 1 0 5 10^5 105 | 1.23e5 |
322.56 | 32256 X 1 0 2 10^2 102 | 3.2256e2 |
0.000056 | 5.6 X 1 0 − 5 10^{-5} 10−5 | 5.6e - 5 |
C标准规定,float类型必须至少能表示6位有效数字,且取值范围至少是 1 0 − 37 1 0 + 37 10^{-37}~10^{+37} 10−37 10+37。
- 前一项规定指float类型必须至少精确表示小数点后的6位有效数字,如33.333333。
- 后一项规定用于方便地表示诸如太阳质量(2.0e30千克)、一个质子的电荷量(1.6e-19库仑)或国家债务之类的数字。
通常,系统储存一个浮点数要占用32位。其中8位用于表示指数的值和符号,剩下24位用于表示非指数部分(也叫作尾数或有效数)及其符号。
C语言提供的另一种浮点类型是double(意为双精度)。double类型和float类型的最小取值范围相同,但至少必须能表示10位有效数字。
一般情况下,double占用64位而不是32位。一些系统将多出的32位全部用来表示非指数部分,这不仅增加了有效数字的位数(即提高了精度),而且还减少了舍入误差。
另一些系统把其中的一些位分配给指数部分,以容纳更大的指数,从而增加了可表示数的范围。无论哪种方法,double类型的值至少有13位有效数字,超过了标准的最低位数规定。
C语言的第3种浮点类型是long double,以满足比double类型更高的精度要求。不过,C只保证long double类型至少与double类型的精度相同。
【1】声明浮点型变量
float noah , jonah;
double trouble;
float planck = 6.63e-34;
long double gnp;
【2】浮点型常量
在代码中,可以用多种形式书写浮点型常量。浮点型常量的基本形式是:
有符号的数字(包括小数点),后面紧跟e或E,最后是一个有符号数表示10的指数。下面是两个有效的浮点型常量:
-1.56E+12
2.87e-3
- 正号可以省略
- 可以没有小数点 (2E5) 或指数部分 (19.28),但是不能同时省略两者
- 可以省略小数部分(3.E16) 或整数部分( .45E-6),但是不能同时省略两者
3.14159
.2
4e16
.8E-5
100.
【强调】别在浮点型常量中间加空格
默认情况下,编译器假定浮点型常量是double类型的精度。
- 在浮点数后面加上f或F后缀可覆盖默认设置,编译器会将浮点型常量看作float类型,如2.3f 或 9.11E9F
- 使用l或L后缀使得数字成为long double类型
- 没有后缀的浮点型常量是double类型。
C99标准添加了一种新的浮点型常量格式——用十六进制表示浮点型常量,即在十六进制数前加上十六进制前缀(0x或0X),用p和P分别代替e和E,用2的幂代替10的幂(即,P计数法)。如下所示:
Oxa.1fpl0
十六进制a等于十进制10,.1f是1/16加上15/256(十六进制f等于十进制15),p10是 2 10 2^{10} 210或1024。
0xa.1fp10表示的值是(10+1/16+15/256)×1024(即,十进制10364.0)。
注意,并非所有的编译器都支持C99的这一特性。
【3】打印浮点值
printf()函数
- 使用%f转换说明打印十进制记数法的float和double类型浮点数
- 用%e打印指数记数法的浮点数。
如果系统支持十六进制格式的浮点数,可用a和A分别代替e和E。打印long double类型要使用%Lf、%Le或%La转换说明。给那些未在函数原型中显式说明参数类型的函数(如,printf())传递参数时,C编译器会把float类型的值自动转换成double类型。
#include<stdio.h>
int main(void){
float aboat = 32000.0;
double abet = 2.14e9;
long double dip = 5.32e-5;
printf("%f can be written %e\n", aboat, aboat);
printf("And it's %a in hexadecimal, powers of 2 notation\n", aboat);
printf("%f can be written %e\n", abet , abet);
printf("%lf can be written %le\n", dip, dip);
return 0;
}
【4】浮点值的上溢和下溢
-
上溢:当计算导致数字过大,超过当前类型能表达的范围时,发生上溢。
现在C 语言规定,在这种情况会给toobig 赋一个表示无穷大的特定值。
-
当除以一个很小的数时,情况更为复杂。
在计算过程中损失了原末尾有效位上的数字,这种情况 → 下溢。
C 语言把损失了类型全精度的浮点值称为 低于正常的浮点值。
还有一个特殊的浮点值NaN(Not a Number)。
【浮点数舍入错误】
给定一个数,加上1,再减去原来给定的数,结果是多少?
#include<stdio.h> int main(void){ float a, b; b = 2.0e20 + 1.0; a = b - 2.0e20; printf("%f \n", a); return 0; }
原因:计算机缺少足够的小数位来完成正确的运算。