当前位置: 首页 > 科技观察

EasyC++、C++浮点数类型分析

时间:2023-03-13 04:58:09 科技观察

浮点数浮点数是C++的第二组基本类型,可以用小数部分表示数字。不仅如此,浮点数的范围比int更大,可以表示更大范围的数。我们都知道,在计算机中,所有的数据本质上都是转化为二进制存储的。整数很简单,存储的是转换成二进制后的01字符串,那么浮点数是怎么存储的呢?很容易猜到浮点数存储的结果也是二进制的,但是比起直接把整数转换成二进制要复杂一些。需要表达成如下一行:其中n是我们要存储的浮点数,s是符号位,m是尾数,e是阶数。符号位很容易理解。与整数类型中的符号位相同。0表示正数,1表示负数。m代表尾数,.当我们这样看时,它非常抽象。我们看一个例子,比如3.0,相当于转成二进制。所以,我们了解了浮点数的表示方式,那么它在计算机中是如何存储的呢?这就需要我们进一步分析细节了。关于m首先是m,m定义为大于等于1小于2的小数,我们可以简单的写成1.xx,其中xx代表小数部分。因为它总是大于等于1小于2,所以它的个位一定是1,所以我们可以省略它,只看它后面的小数部分。对于小数部分,我们也用二进制来近似。例如0.625可以表示为0.5+0.125,即用二进制表示,但这里它的最高位是从-1开始的。以一个32位的浮点数为例,去除1位符号和8位顺序后,还剩下23位m。由于我们去掉了小数点前的1,所以我们的顺序是从-1开始的,理论上相当于24个二进制位。关于浮点存储中的e,e是一个无符号整数。以一个32位的浮点数为例,e一共有8位,可以表示0-255。但是,e可以是负数。根据IEEE754,e的实际值必须从中间数中减去。对于8位的e,它的中位数是127,比如e的实际值为10,但存储时需要存储为127+10=137。此外,e还有其他三种情况:当e不全为0或不全为1时,以上规则用来表示当e全为0时,e等于1-127,有效数m为无默认添加更长的时间,这是恢复0.xxx的小数,当接近0的数e全为1时,如果有效数m全为0,则表示无穷大;如果m不全为0,则表示nan(不是数字)关于e的规则似乎有点复杂,乍一看很难理解。为什么要用减去中间值的设计而不是符号位呢?仔细一想,发现如果引入符号位,0.xxx和e就很难区分了。0,虽然也可以专门处理,但是没有现在这么优雅。对以上内容不理解的朋友可以直接跳过这一段。毕竟这是浮点数的实现原理,算是很底层的内容了。C++primer中对这部分的解释不多。在C++中有两种写浮点数的方法。第一种是使用常规的十进制表示法:doublea=1.23;浮动b=3.43;另一种是科学记数法,写成:doublea=2.45e8;doubleb=1e-7;2.45e8表示e后面可以跟正数或负数,但数字中不能有空格。浮点类型与C语言一样,C++也有三种浮点类型:float、double和longdouble。和整数一样,这三种都是浮点数,只是代表的范围不同。浮点数的取值范围由两部分综合决定,一部分是有效数字。例如14179有5位有效数字,而14000只有2位有效数字,因为最后三个0是填充数字,有效数字的个数与小数点的位置无关。C++要求float至少表示32位有效数字,double至少48位,longdouble至少和double一样。此外,它们至少能够表示从-37到37的指数。一般来说,float总共有4个字节和32位,而double有8个字节和64位。当然,这也要看具体的运行环境。注意事项浮点数的使用有几个注意事项,必须注意。cout输出的浮点数会删除结尾的0。写浮点常量时,默认类型是double。如果需要强制表示为float类型,请在末尾加上后缀f或F。例如:2.34f由于浮点数是有精度的,不能直接判断两个浮点数是否相等,可能得不到预期的结果。正确的做法是判断精度范围,如:doubleepsilon=1e-8;//判断a是否等于bif(abs(a-b)