C语言float的精度问题

前言:在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的精度问题就讲到这里了,更多内容,请期待下次的讲述

欢迎有问题的伙伴及时留意讨论,有不足之处还望指正

祝大家生活工作愉快~

你可能感兴趣的:(嵌入式,c语言,嵌入式硬件)