学习笔记丨浮点数探究
注:本文使用的环境为:Ubuntu18.0/64位
在学习C语言的基础数据类型的时候老师给到这样一道题目:
写出 float A 和“零值”比较的 if语句。
当时我想,直接比较一下不就好了吗?当时给出的代码是:
结果就是if中的判断不会为真,所以不会输出“A=0”这一语句,为什么会这样呢?我带着疑惑深入了解了下C语言中浮点数的构成。
浮点数的定义
百度百科中给出了这样一个定义:
浮点数,是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。
注意到浮点数在计算机中是近似的表示某数,至于为什么是近似的让我们来浮点数的构成。
浮点数的组成
计算机存储整数我们熟悉它使用的是二进制,储存小数则用的是二进制分数如:
(3.625)D =(2+1+0.5+0.125)D= (011.101)B
根据国际标准IEEE 754,任意一个二进制浮点数可以表示成下面的形式:
其中s表示符号位为0表示正数,为一表示负数,c表示尾数范围为[1,2),b表示基数,这里取2,e表示指数位。
IEEE 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。
这样设计后小数点不再固定的某一位,而是根据实际情况浮动,有效的利用了内存。
但是二进制分数的表示相比较于十进制更容易出现无限循环小数,如:
(0.1)D = (0.00011001100110011...)B
这就导致要舍弃掉一些精度。
所以在与一个浮点数比较时不能直接比较,要与一个区间比较,所以开头的问题应修改为:
参考:What's Up With Floating Point?
封面:该图片由Alexas_Fotos在Pixabay上发布
评论