写点什么

学习笔记丨浮点数探究

用户头像
Liuchengz.
关注
发布于: 2020 年 09 月 17 日
学习笔记丨浮点数探究

注:本文使用的环境为:Ubuntu18.0/64位


在学习C语言的基础数据类型的时候老师给到这样一道题目:

写出 float A 和“零值”比较的 if语句。

当时我想,直接比较一下不就好了吗?当时给出的代码是:

...
folat A = 0
if0 == A)
{
printf("A=0\n");
}
...

结果就是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

这就导致要舍弃掉一些精度。

所以在与一个浮点数比较时不能直接比较,要与一个区间比较,所以开头的问题应修改为:

...
folat A = 0
if(A <= 0.0000001 & A >= -0.0000001
{
printf("A=0\n");
}
...




参考:What's Up With Floating Point?

封面:该图片由Alexas_FotosPixabay上发布 

用户头像

Liuchengz.

关注

选择和时间做朋友 2018.09.18 加入

写作新人,请多批评和指正

评论

发布
暂无评论
学习笔记丨浮点数探究