变量的表示范围与浮点数精度(提高篇)
本节主要介绍Fortran中的变量的范围,简单介绍IEEE754和浮点数的误差
整数
计算机使用二进制来表示数据,一个默认的整数类型占4个字节,一共有32位,每个位有两种状态,所以一共可以表示的数据量为\(2^{32}\)。
因为我们需要同时表示负数、正数和零,所以,整数的表示范围被设计为\([-2^{31},2^{31}-1]\)一共有\(2^{32}\)个数。
如果需要表示的数据超过了这个限度,那么就需要kind值更大的整数类型integer(8)
来表示
浮点数
整数是完全精确的,但是在实际的生活工作中,我们不一定需要这么精确的数,\(\pi=3.14\)或者是\(\pi=3.141592653\)对某些计算来说并不重要。但是相对的,数值可以表达的范围对某些行业更为有用,比如天体之间的距离。所以我们可以舍弃一部分的精确度来换取更大的表示范围,这就是浮点数。
IEEE754
按照IEEE754 浮点数的标准,浮点数由三部分组成:符号位(sign),指针偏移值(exponent)和分数值(fraction)。 一个浮点数是这三部分的乘积\(Value=sign\times exponent \times fraction\)
浮点数的默认类型也是占4个字节,32个位,所以能表示的状态最多也是\(2^{32}\)个,因此,注定有些数字没有办法精确表示,IEEE754的处理方法是:
$$(sign)1+(exponent)8+(fraction)23=32$$
-
用23个位表示一组分数,\(fraction=1+\sum_{i=1}^{23}\frac{a[i]}{2^i}\),其中a[i]表示这个位是0还是1。
-
用8个位表示指数,\(exponent=2^{M-127}\),M的取值范围是[0,255]
浮点数就是利用exponent把给定的fraction按照比例放大或者缩小。即能用这个公式表示出来的都是精确的数,其余的数都是近似等于这些数中的一个。
所以,浮点数的精度是由fraction来决定的,在十进制表示下,精度为\(log_{10}2^{23}=6.923\),所以通常说单精度浮点数的有效数字是6.9
Infinity
当符号位\(M\)取最大值255,且分数位全为0时,此时规定这个值为Infinity
Nan
当符号位\(M\)取最大值255,且分数位不全为0时,此时规定这些值均为Nan
思考题
- 按照浮点数公式,推算在浮点数表示下可以精确表示的最大整数是多少
- 调研什么是非格式化浮点数(denormal)