一、类型说明
浮点型
变量,也称为实型
变量,用来存储小数数值的。
浮点型变量分为三种:单精度浮点型(float)、双精度浮点型(double)、长双精度浮点型(long double)。
类型 | 占用空间 | 取值范围 |
---|---|---|
float | 4个字节 (=32位) | − 1.4 ∗ 1 0 − 45 -1.4*10^{-45} −1.4∗10−45 ~ − 3.4 ∗ 1 0 + 38 -3.4*10^{+38} −3.4∗10+38, 1.4 ∗ 1 0 − 45 1.4*10^{-45} 1.4∗10−45 ~ 3.4 ∗ 1 0 + 38 3.4*10^{+38} 3.4∗10+38 |
double | 8个字节 (=64位) | − 4.9 ∗ 1 0 − 324 -4.9*10^{-324} −4.9∗10−324 ~ − 1.7 ∗ 1 0 + 308 -1.7*10^{+308} −1.7∗10+308, 4.9 ∗ 1 0 − 324 4.9*10^{-324} 4.9∗10−324 ~ 1.7 ∗ 1 0 + 308 1.7*10^{+308} 1.7∗10+308 |
long double | 12个字节(=96位) | 太大了… |
其中,
类型 | 16位编译器 | 32位编译器 | 64位编译器 |
---|---|---|---|
float | 4字节 | 4字节 | 4字节 |
double | 8字节 | 8字节 | 8字节 |
float表示数据的范围要大于long类型表示的范围
浮点型变量不能使用signed或unsigned修饰符
最常用的浮点类型为:double 类型,因为精度比float高。
浮点型常量,默认为 double 类型。d2=d1+2.3; // 2.3是double类型
二、后缀
float
:在小数后面添加后缀f
或F
double
:因为默认就是double类型的,无需后缀
long double
:在小数后面添加后缀l
或L
三、实例
1.定义一个float型
两种写法一样
float f = 1.23f;
float f = 1.23F;
2.科学计数法
使用科学计数法表示浮点数,使用字母 e或E
来分隔小数部分和指数部分。
注意,e 的前后,不能存在空格。
这四种写法是一样的
double x = 123.456e+3; // 123456.000000
double x = 123.456E+3;
double x = 123.456e3;
double x = 123.456E3;
小数部分如果是 0.x 或 x.0 的形式,那么 0 可以省略
0.3E6 // 300000
.3E6
3.0E6 // 3000000
3.E6
3.练习题
需求:有人用温度计测量出用华氏法表示的温度(如64°F),今要求把它转换为以摄氏法表示的温度(如17.8℃)。转换的公式为: c = 5 9 ( f − 32 ) c = \frac{5}{9}(f - 32) c=95(f−32)。
#include <stdio.h>
int main() {
float f, c; //定义f和c分别表示华氏温度、摄氏温度
f = 64.0; //指定f的值
c = (5.0 / 9) * (f - 32); //利用公式计算c的值
printf("f=%f\nc=%f\n", f, c); //输出c的值
return 0;
}
注意细节:
5 / 9
结果为 0,但是5.0 / 9
结果可不是 0
四、存储规则
这里我们来解释一下凭什么float(4个字节)表示数据的范围要大于long类型(8个字节)表示的范围
任何有小数点的数值,都会被编译器解释为浮点数。所谓“浮点数”就是使用 m * b^e 的形式,存储一个数值, m 是小数部分, b 是基数, e 是指数部分。
1.从十进制角度:
2.从二进制角度
根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式: ( − 1 ) S ∗ M ∗ 2 E (-1)^S * M * 2^E (−1)S∗M∗2E
其中:
- ( − 1 ) s (-1)^s (−1)s表示符号位,当s=0,V为正数;当s=1,V为负数。
- M表示有效数字,大于等于1,小于2。
- 2 E 2^E 2E表示指数位。
例如:十进制的5.0,写成二进制是 101.0 ,相当于 1.01× 2 2 2^2 22 。即,按照上面V的格式,可以得出s=0,M=1.01,E=2。十进制的-5.0,写成二进制是 -101.0 ,相当于 -1.01× 2 2 2^2 22 。即,s=1,M=1.01,E=2。
3.IEEE 754(二进制)
Ⅰ.32位
最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。
Ⅱ.64位
最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。