目录
一.为什么会对浮点数的类型转换有疑惑?
我们学了很多种浮点数的数据类型:
变量类型 | 定义方式 | 占用字节 |
单精度 | float | 4字节 |
双精度 | double | 8字节 |
长精度 | long double | 12字节 |
我们知道 int 一般是占用4个字节,32位,是一个有符号的数据类型(not U),也就是他1,111111111111111111111111111111111111,那float也是32位,为啥转换了之后,
1.1->1
-1.2->-1
0.2->0
二.精度问题
1.先daoke一下各种数据类型的转换
看图说话,低字节转向高字节进行计算
2.浮点数何IEEE754
eg:32位浮点数
符号位 S(Sign)决定数是正数(s=0)还是负数(s=1),而对于数值 0 的符号位解释则作为特殊情况处理。
有效数字位 M(Significand)是二进制小数,它的取值范围为 1~2-ε,或者为
0~1-ε。它也被称为尾数位(Mantissa)、系数位(Coefficient),甚至还被称作“小数”。
指数位E(Exponent)是 2 的幂(可能是负数),它的作用是对浮点数加权。(规格化后小数点第一位总是1,故规定第一位默认的“1”不明显表示出来。这样可用23个数位表示24位尾数。
因为原码对称,故其表示范围关于原点对称
IEEE754是一个标准,他提供了两种基本浮点格式,32位单精度何64位双精度格式哦
32位单精度是跟上面的图一样,64位双精度是包含了11位阶码和52位尾数的。
IEEE754的好处
1.尾数可表示多一位,从而推高浮点数的精度
2.指数的克表示范围更大,因此,浮点数 可表示范围也更大
对于IEEE754,阶码全0.1有特别的解释!
3.精确度
我的理解是,由于阶码尾数的不同,浮点数的精确度也不同,因为随着阶码位数增多,小数点后面可以表示的位数增多,有很多时候会发现int类型的数据转换成float是可以的,但int数据被舍入了,因为float的精度比int低。