美文网首页
浮点数简述

浮点数简述

作者: 水哥不知道要干嘛 | 来源:发表于2019-02-24 16:20 被阅读0次

背景

我们都知道计算机内部存储和表示数据都是用二进制来表示的,所以当你想表示一个浮点数的时候,很自然的就是跟整数的二进制一样,只不过多了个小数点,如下所示:

1011.101_{2} = 1 \times  2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 + 1 \times 2^-1  + 0 \times 2^-2 + 1 \times 2^-3= 11.265_{10}

也就是每一位的权重都是对应的2的i次幂,也就是可以用如下公式表示:

b_{m} b_{m-1}...b_{1} b_{0}.b_{-1}b_{-2}...b_{-n+1}b_{-n} = \sum_{-n}^m2^i \times b_{i}

但是这种表示方法有几种缺陷:

1. 小数部分只能表示符合 x \times 2^y的数字,像 1/5 这种数字,只能无限接近

2. 在有限的长度内,比如32位或者64位,用这个表示方法很难表达很小以及很大的数

在1985年前,各个计算机厂商都有自己的浮点数表示和计算方法,并且大部分都不会把精确度放在第一位,更多的是考虑计算速度和实现上的方便。直到1985年,IEEE 才起草出版了 IEEE 754标准 ,统一了浮点数表示和计算方法。

IEEE 754标准

IEEE 754 标准是IEEE于1985年发布的关于浮点数计算的世界唯一通用标准,所有主流CPU都支持这个标准。

浮点数表示方法

1. 计算公式

(-1)^s \times  M \times  2^E

+ 符号位 s 决定了该数是正数还是负数

+ 有效位 M 决定了小数部分的数值,数值范围为 [1.0, 2.0)

+ 指数位 E 表示2的幂次

2. 内存表示及解码规则

浮点数二进制表示

其中:

+ s 是符号位

+ exp 部分用来编码指数 E (但不等于 E)

+ frac 部分用来编码有效位 M (但不等于 M)

3. 32位和64位浮点数比较

+ 单精度 32位

数值大小 \approx 10^\pm 38

32位浮点数表示

+ 双精度 64位

数值大小 \approx 10^\pm 308

64位浮点数表示

浮点数类型

在浮点数表示中,E 是一个有符号int,是通过一个偏移量(bias)来计算和表示的,其中bias = 2^k - 1  , 其中k为exp的位数减1。比如单精度k为7,双精度k为10。

1. "Normalized"

exp 部分不全为0 并且不全为1时,表示该浮点数为 Normalized。

+ E 可通过公式计算:E = Exp - Bias

+ M 编码为:1.xxx...xxx_{2} , 其中

   - xxx...xxx 为 frac部分

   - 最小值为M=1.0, 最大值是当frac=111.....1111 (M=2.0-\varepsilon )

   - 此时 M 部分自动带上前面的1

比如 :

15213_{10} = 11101101101101_{2}

               = 1.1101101101101_{2} \times 2^13

其中:E = Exp - Bias = 140 - 127 = 13

15213二进制表示

2. "Denormalized"

当 exp = 000...0 时,此时

+ E 可通过公式:E = 1 - Bias

+ M 可编码为:0.xxx...xxx_{2} ,其中

   - xxx.xxxx 为frac部分

+ 表示两种类型的数

   - exp = 00...000, frac = 000...0000, 表示0,-0和+0是不同的表示

   - exp = 00...000, frac \neq 000...0000, 表示接近于0的数字

3. 特殊数字

当 exp = 111...111时

+ exp = 111...111, frac = 000...000

   - 表示无限数,用于处理计算溢出的情况,有正反符号

+ exp = 111.111, frac \neq 000...000, 表示 NaN

浮点数计算注意事项

1. 浮点数相加和相乘并不符合数学四则运算的 结合律,比如

(3.14+1e10) - 1e10 = 0,    3.14 + (1e10-1e10) = 3.14 (大小数相加取整导致丢失精度)

 (1e20*1e20) * 1e-20= inf,       1e20 * (1e20*1e-20)= 1e20  (大数相乘导致溢出)

2. 浮点数相乘不符合数学四则运算的 分配律, 比如

  1e20 * (1e20-1e20)= 0.0, 1e20*1e20 – 1e20*1e20 = NaN

相关文章

  • 浮点数简述

    背景 我们都知道计算机内部存储和表示数据都是用二进制来表示的,所以当你想表示一个浮点数的时候,很自然的就是跟整数的...

  • BigDecimal加减乘除计算

    一、简述 在很多编程语言中,浮点数类型float和double运算会丢失精度。 在大多数情况下,计算的结果是准确的...

  • PHP浮点数精度问题

    PHP常见的浮点数“bug” 浮点数的表示形式 浮点数的表示(IEEE 754): 浮点数, 以64位的长度(双精...

  • Python 入门演示

    简单的数学运算 整数相加,得到整数: 浮点数相加,得到浮点数: 整数和浮点数相加,得到浮点数: 变量赋值 Pyth...

  • 6-0. 混合类型数据格式化输入

    本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。 输入格...

  • 3_浮点数的秘密

    关键词:内存中的浮点数、浮点数存储示例、十进制浮点数的内存表示、 float类型的不精确示例 1. 内存中的浮点数...

  • python中的数据类型和变量

    浮点数 浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1....

  • Python基础知识点拾遗

    浮点数 系统浮点数信息 1.完整信息 显示结果为: 2.浮点数能表示的最大值 3.浮点数能表示的最近接0的值 4....

  • 1.2 浮点型运算

    在计算机中,浮点数虽然表示的范围大,但是,浮点数有个非常重要的特点,就是浮点数常常无法精确表示。浮点数在内存的表示...

  • 浮点数原理与精度损失问题

    写在前面 碰巧最近定义接口的时候碰到了浮点数精度的问题,稍微整理了浮点数的一些知识点: 浮点数的底层表示 浮点数的...

网友评论

      本文标题:浮点数简述

      本文链接:https://www.haomeiwen.com/subject/wyovyqtx.html