Skip to content

Commit

Permalink
Merge pull request #10 from fortran-fans/Euler-37-patch-1
Browse files Browse the repository at this point in the history
Create ch03-01-precision.md
  • Loading branch information
Euler-37 authored Jan 20, 2024
2 parents 471590e + 35ca830 commit 6478bd6
Showing 1 changed file with 43 additions and 0 deletions.
43 changes: 43 additions & 0 deletions src/ch03-01-precision.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# 变量的表示范围与浮点数精度

本节主要介绍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*exponent*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)

0 comments on commit 6478bd6

Please sign in to comment.