大家好,我是唐靓。
今天是EasyC的第7篇,浮点型。
访问github仓库:EasyLeetCode,欢迎明星,欢迎pr~
浮点数
浮点数是C的第二种基本类型,可以用小数部分表示数字。此外,浮点数的范围比整数大,可以表示更大范围的数字。
我们都知道,在计算机中,所有的数据本质上都是转换成二进制存储的。整数很简单,转换成二进制后存储01字符串,那么浮点数是怎么存储的呢?
很容易猜到浮点数存储的结果是二进制,但是比直接把整数转换成二进制要复杂一点。需要先用下面一行来表达:
这里,n是我们要存储的浮点数,s是符号位,m是尾数,e是顺序。
符号位很好理解,和整数中的符号位一样,0代表正数,1代表负数。m代表尾数,
。让我们抽象地看一下。我们来看一个例子,比如3.0,转换成二进制(11.0),相当于
1.1 * 2^1。那么,s = 1,m = 1.1,e = 1。
我们知道浮点数的表示,那么它在计算机中是如何存储的呢?这就需要我们进一步分析细节了。
关于M
首先是M,定义为大于等于1小于2的小数。我们可以简单的写成1.xx,其中xx代表小数部分。
由于总是大于等于1小于2,所以它的单位一定是1,所以我们可以省略它,只看它后面的小数部分。我们也用二进制来近似小数部分。比如0.625可以表示为0.5 0.125,也就是2 -1 2-3,二进制就是101,只不过这里它的更高位从-1开始。
以32位浮点数为例。在1位表示符号,8位表示顺序之后,剩下23位用于m。由于我们在小数点之前舍入了1,所以我们的顺序从-1开始,这在理论上相当于24个二进制位。
关于e
在浮点数存储中,e是一个无符号整数。以32位浮点数为例。e有8位,可以代表0-255。
然而,E可以是负的。根据IEEE 754,E的真实值必须是减去一个中间数。对于8位E,它的中间数是127。比如e的实际值是10,但存储时需要存储为127 ^ 10 = 137。
除此之外,E还有另外三种情况:
e不全为0,或全为1时,采用上述的规则表示e全为0时,e等于1-127,有效数字m不再默认加上1,这样是为了还原0.xxx的小数,以及接近于0的数e全为1时,如果有效数字m全为0,表示无穷大,如果m不全为0,表示nan(not a number)关于E的规则似乎有点复杂,乍一看似乎有点难以理解。为什么要用减去中间值的设计来代替符号位?我仔细考虑后发现,如果引入符号位,很难区分0.xxx和e等于0的情况。虽然也可以通过特殊判断处理,但没有现在这么优雅。
认为看不懂以上的朋友可以直接跳过这一段。毕竟这是浮点数的实现原理,是很低级的内容。C primer对这部分没有太多的阐述。
浮点数的使用
用c语言编写浮点数有两种方法。之一种方法是使用传统的十进制表示法:
double a = 1.23;float b = 3.43;另一种写法是科学记数法,写为:
double a = 2.45e8;double b = 1e-7;2.45e8就是2.45 * 10 ^ 8的意思。e后面可以是正数,也可以是负数,但是数字中不能有空。
浮点型
和C一样,C也有三种浮点数:float、double和long double。和integer一样,这三种类型都是浮点数,只是取值范围不同。
浮点数的范围由两部分决定,一部分是有效数字。比如14179是五位有效数,而14000只有两位,因为后三位零是填充位,有效位数不取决于小数点的位置。c要求float通常可以表示7位有效数字,double通常可以有16位,long double至少与double相同。
另外,它们所能表达的指数范围至少是-37到37。一般来说,float是4字节32位,double是8字节64位。当然也要看具体的运行环境。
需要注意的事项
关于浮点数的使用,有几点需要注意。一定要关注他们。
cout输出浮点数会删除结尾的0书写浮点数常量时默认为double类型,如果需要强制表示为float类型,请在结尾加上后缀f或者F,如:2.34f由于浮点数有精度,不能直接判断两个浮点数是否相等,很有可能得不到预期结果,正确的做法是判断精度范围,如:double epsilon = 1e-8;// 判断a是否和b相等if (abs(a - b)本文地址:百科生活频道 https://www.neebe.cn/live/938493.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!