C语言float的精度问题

前言:在C语言中,单精度数据类型float的精度(有效位)是6-7位,那这个6-7位是怎么理解呢,本文一探究竟。

一、先上各个基础数据类型的定义

类型符号关键字字节数(16位编译)数的表示范围32位(所占字节数)64位(所占字节数)
字符型char1-128~127  
unsigned char10~255  
char*(指针变量)2 48
整型short2-32768~32767【2^15-1】  
int2-32768~327674(数据范围也有变化,其他同理)4
long4-2147483648~214748364748
unsigned short20~65535  
unsigned int20~655354(..)  4
unsigned long40~42949672954 8(..)
实型float4有效位6  
double8有效位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的精度问题就讲到这里了,更多内容,请期待下次的讲述

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

祝大家生活工作愉快~

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值