浮点数的使用
浮点数的表示方法
浮点数常采用符号+阶码+尾码
的表示方法,单精度浮点数由1位符号位,8位阶码和23位尾码表示;双精度浮点数由1位符号位,11位阶码和52位尾码表示。
1 | float f = 3.14; |
浮点数并不能完整地表述所有的十进制小数,就好像十进制小数不能完整表示三分之一一样,浮点数就不能在没有精度丢失的情况下表示0.1。
1 | float zero_one = 0.1; |
当浮点数多次累加时,会导致误差也累加:
1 | float sum = 0; |
无穷
用阶码全为1,尾码全为0的浮点数表示无穷大,C++中可以使用limits
头文件中的numeric_limits::infinity
方法获取,使用cmath
头文件中的infinity
方法判断是否是无穷大。
1 | float inf = numeric_limits<float>::infinity(); |
无穷数的运算基本符合数学上定义的规则。
最小精度
numeric_limits::min()
方法获取到的是规格化数的最小精度,单精度为2的负127次方,numeric_limits::denorm_min()
方法获取的是非规格化数的最小精度,单精度为2的负150次方。
1 | float fmin = numeric_limits<float>::min(); |
浮点数的最大值通过numeric_limits::max()
获取,而最小(最低)值是通过numeric_limits::lowest()
获取,名字上感觉有一点别扭,很容易错用成numeric_limits::min()
。
非数
浮点数非数使用阶码全为1,尾码不全为0表示,可分为两类,一类是不会触发任何异常的非数,一般表示无意义或未定义的操作结果;另一类是信号非数,可用于引发信号或异常。
1 | float nan = numeric_limits<float>::quiet_NaN(); |
不触发任何异常的非数使用numeric_limits::quiet_NaN()
方法获取,信号非数可以使用numeric_limits<float>::signaling_NaN()
获取,然后使用cmath
中的isnan
函数可以判断浮点数是否为非数。像是浮点数类型的零除以零操作,返回的就是非数。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 cwt技树年轮!
评论