前言:在C语言中,单精度数据类型float的精度(有效位)是6-7位,那这个6-7位是怎么理解呢,本文一探究竟。
一、先上各个基础数据类型的定义
类型 | 符号 | 关键字 | 字节数(16位编译) | 数的表示范围 | 32位(所占字节数) | 64位(所占字节数) |
字符型 | 有 | char | 1 | -128~127 | ||
有 | unsigned char | 1 | 0~255 | |||
无 | char*(指针变量) | 2 | 4 | 8 | ||
整型 | 有 | short | 2 | -32768~32767【2^15-1】 | ||
int | 2 | -32768~32767 | 4(数据范围也有变化,其他同理) | 4 | ||
long | 4 | -2147483648~2147483647 | 4 | 8 | ||
无 | unsigned short | 2 | 0~65535 | |||
unsigned int | 2 | 0~65535 | 4(..) | 4 | ||
unsigned long | 4 | 0~4294967295 | 4 | 8(..) | ||
实型 | 有 | float | 4 | 有效位6 | ||
有 | double | 8 | 有效位15 |
(注意:实际生产中,对于嵌入式来说,常用的是32位机器,上表供学习用)
二、对于float的6-7位有效位解释
有效位(精度):从左往右数,不算小数点,数据个数。
我们从下列的例子,从中学习比较:
示例一:float a = 123456788.423f; printf(“%f”,a); //结果:123456720.000000 ,6位绝对有效数字,第7位由于受到第8位随机数影响四舍五入,故随机性,可能不变可能变。
示例一:float a = 123456788.423f; printf(“%f”,a); //结果:123456860.000000,解析同上;
示例三:float a = 123.45679999f; printf(“%f”,a); //结果:123.456862,解析同上;
示例四:float a = 1.234567123f; float b = 1.234567123f; a=b?可能等于,也可能不等于;
总结:可以看出,因为从有效位8位开始,由于内部二进制转十进制的原因其转换过程不是一一对应的,而是离散的,故第8位是有随机性,然后再第8位基础上进行四舍五入给第7位,故第7位可能不变,可能变,因此有些书籍说单精度有效位6~7(因为第7位不定),但是6位的精度一定是可以保证的(且不受第7位四舍五入),在日常使用中注意选用6做业务保证安全。
还有一点需要注意,虽然浮点型能存的数范围比较大(比如e38),但是由于有效位的问题,他的数据范围一般没有实际意义(不要编译报错就好)。
好了,本次关于float的精度问题就讲到这里了,更多内容,请期待下次的讲述
欢迎有问题的伙伴及时留意讨论,有不足之处还望指正
祝大家生活工作愉快~