&nbsp

&nbsp

&nbsp

&nbsp

&nbsp

&nbsp

&nbsp

预备知识 数值计算的误差

整数

很自然的,对于一个给定的十进制整数,可以将它转换为二进制数,从而在计算机中表示.下图中的 8 位(8 bits)二进制数 0 1 0 1 1 1 0 1 表示

\begin{equation}

(01011101)2=0\cdot2^7+1\cdot2^6+0\cdot2^5+1\cdot2^4+1\cdot2^3+1\cdot2^2+0\cdot2^1+1\cdot2^0=(93)_{10}

\end{equation}

从 Python3.0 起,可以表示的整数的最大值上限被移除,这就意味着我们可以精确表示任何整数,也就是说只要将给定的整数转换为二进制数,然后占用相应长度的内存空间即可.理论上 16G 的内存可以存储的最大整数约为 $10^{5.17\times10^9}$ .

另外,由于两个不同整数之间的最小间隔为 1(整数的机器精度),因此,与整数有关的加、减和乘法都可以被精确计算,并且没有任何舍入误差.

例子 1:大整数及其运算

注 1:普通除法运算 / 在 Python 中会默认转换为浮点数,因此并不能保证完全精确.

注 2:整数除法 // 可以保证精确,但是结果只有商,余数可以用 % 求得.

浮点数

不同于整数,实数是连续的,这就意味着两个不相同的实数之间的最小距离可以无限接近于 0.前文中对于整数的存储方式显然不再适用,我们并不能把所有实数都在计算机中表示出来.甚至我们都不能把 0 到 1 之间的所有实数表达出来.

这就要求计算机对实数运算进行一定的近似,使得给定任意一个实数,我们都能找到一个与它接近的计算机浮点数表达.同时,计算机浮点数系统需要保证运算精度和速度.这就要求计算机浮点数系统需要尽可能满足下面的条件:

每个浮点数占用的内存空间一致.

覆盖的范围尽可能大

舍入误差或机器精度尽可能的小.关于舍入误差,参见 “数值计算的误差”.

下面我们会一步一步的设计一个 8 位(8 bits)的浮点数系统,也就是用 8 位的 256 个二进制数字来表达浮点数,并逐步满足上述条件.从而探究一下真正的 IEEE 浮点数标准是如何设计和指定的.

简单的二进制表达浮点数

类似二进制以 2 为基的方式,我们也可以用 $1/2$ 为基,那么 8 位二进制数 0 1 0 1 1 1 0 1 就表示

\begin{equation}

\begin{aligned}

(01011101)_2 &= 0\cdot2^{-1}+1\cdot2^{-2}+0\cdot2^{-3}+1\cdot2^{-4}\\

&\quad +1\cdot2^{-5}+1\cdot2^{-6}+0\cdot2^{-7}+1\cdot2^{-8}\\

&= 0.36328125

\end{aligned}

\end{equation}

事实上,这个 8 位二进制数和前面整数一章用到的是同一个二进制数,但他们因为数据类型不同,代表的含义也就不同了.

由此,我们的 8 位浮点数系统可以表示 256 个在 0 到 $1-\frac{1}{2^8}=0.99609375$ 之间的实数,它们的机器精度为 $\frac{1}{2^8}=0.00390625$.

小结:此方法的机器精度是 8 位系统可达到的最小值,但覆盖范围仅为 0 到 1

扩大范围

想要表达更大的数,可以从上面的方式出发,将得到的 0 到 1 之间的数都乘以一个固定的值,例如乘以 8.这样,我们的浮点数系统的覆盖范围扩大到了 $0$ 到 $7.96875$.但是这个操作也会将机器精度乘以相应的值,使其下降为了 $\frac{1}{2^5}=0.03125$.

小结:等比例的扩大范围会大幅降低机器精度.

标准化

延续上面的思路,我们可以用乘以多个不同的倍数的方法来控制所扩大的范围.也就是说,从 8 位二进制中拿出 2 位(下面的例子中用的是最后两位,但也可以是前面两位),用来记录扩大的倍数,而前面的 6 位同之前一样用作表达 0 到 1 之间的实数,这 6 位被称作尾数位(mantissa).

为了进一步扩大范围,取出的 2 位从二进制转化为十进制后,被放在以 2 为基(basis)的指数位置上形成放大的倍数,因此这 2 位在这个系统中被称为指数位(exponent).

如下图,我们继续使用同样的 8 位二进制数,在经过标准化过程后,表达的数为

图 1:请添加图片描述

对于我们的 8 位浮点数系统而言,相当于将所有表达在 $0$ 到 $7.875$ 之间浮点数标准化,机器精度随着浮点数增大而等比例增大.即在任意取值情况下,相对的机器精度都保持在 $\frac{1}{2^6}=0.015625$

小结:此方法在保持了与上一小节相似的范围的同时,将机器精度提升了一倍.但是,我们注意到,这个方法有一个严重的问题在于重复,例如 01011101 和 10111000 都表示了同一个数.

去掉重复

去掉重复数字的方法很巧妙,这个方法并不改变上一小节中的标准化方式,只是在对尾数位求和过程中加上一个常数 1,即

\begin{equation}

\begin{aligned}

(01011101)_2 &=({\color{red}{1}}+0\cdot2^{-1}+1\cdot2^{-2}+0\cdot2^{-3}+1\cdot2^{-4}+1\cdot2^{-5}+1\cdot2^{-6})\times2^1\\

&= 2.71875

\end{aligned}

\end{equation}

使用这种改进方法,我们可以表达 1 至 15.875 之间的 256 个不同的实数,我们把这些浮点数画在数轴上,如下图

图 2:数轴上的浮点数

可以发现,这样表达的浮点数保持了各处一致的相对机器精度,这个相对值约为 $2^{-6}\approx 0.015625$.

注:数轴上小于 1 的范围称为下溢(underflow),而超过 15.875 的范围称为上溢(overflow).

更多的

下面的几个步骤可以进一步完善我们的浮点数系统:

为了表达负数,我们需要从尾数位(mantissa)中取出一位,作为符号位.

为了将下溢降低,我们将指数位表达的十进制数(0,1,2,3)向负数平移,变成(-1,0,1,2).

IEEE 浮点数标准

现在的计算机系统采用的是 IEEE 浮点数标准.每一个浮点数(Python 中的 float 类型)占用 64 位.如下图所示,其中第 1 位为符号位,下面 11 位为指数位,最后 52 位为尾数位(mantissa).

图 3:IEEE 浮点数标准

可知 $f= {i}/{2^{52}}$,$i=0,1,2,...,2^{52}-1$.指数位 $e$ 的标准范围定为 $-1022\le e\le 1023$ ,把 $e=1024$ 作为特殊位,并把 $e=-1023$ 作为保留位(我们放在最后分析).

由此,我们可以求得:

机器精度 eps 为 $\frac{1}{2^{52}}\approx 2.220446049250313\times10^{-16}$.

最小的正浮点数 realmin 为 $2^{-1022}\approx2.2251\times10^{-308}$ ,在 python 中可以通过 numpy.finfo(float).tiny 获得.

最大的浮点数 realmax 为 $(2-2^{-52})\times2^{1023}\approx1.7977\times10^{308}$ ,在 python 中可以通过 numpy.finfo(float).max 获得.

令 $e=1024$ 和 $f=0$ ,表示无穷大 $\infty$ ,即任何大于 realmax 的数,在 python 中可以通过 numpy.inf 得到.

令 $e=1024$ 且 $f\neq0$ ,则表示这不是一个数(NaN,Not a Number).通常出作为 0/0 或者 numpy.inf-numpy.inf 的结果.我们也可以通过 numpy.nan 表达它.

例子 2:numpy 中查看浮点数标准

输出

亚标准(subnormal)

在很多计算系统中,除了上面的标准浮点数以外,还存在着亚标准浮点数(subnormal floating point numbers).

它们是比最小的标准浮点数 realmin( $2.2251\times10^{-308}$ )还要小的正实数.

我们先来看一下下面这个例子:

输出

可以看到

我们能够表示比最小标准数 realmin 更小的一些正实数;

它们的精度随着我们远离 realmin 而降低;

最终,当这个数与 realmin 的比小于约 $10^{-16}$ 时,它变成了 0.

这是因为,我们是用保留位 $e=-1023$ 来表示这类亚标准浮点数,它们范围为 realmin $\times$ eps 到 realmin(eps 为机器精度).也就是说,我们能表示的最最小的正实数为 $2^{-(1022+52)}\approx 0.494\times10^{-323}$ ,但这个数的精度非常低.

注:这里尽管 $e=-1023$ ,但我们并不是用标准浮点数的转换规则进行运算的,同时在尾数前面加的 1 也并没有在这出现.

1. ^ 本文经作者同意转载自知乎专栏 《科学计算》,格式有少量修改.

致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择会员制,大量广告,内容付费等。 因此,我们请求广大读者热心打赏,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 10 元,我们一个星期内就能脱离亏损, 并保证网站能在接下来的一整年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

小时用计算机怎么算,计算机算数相关推荐

  1. NPER用计算机怎么算,计算机财务管理第三章详解.doc

    计算机财务管理 第三章 EXCEL在资金时间价值计算中的应用 货币的时间价值,是财务管理的基础.这一章除了对基本理论和公式进行归纳,还重点介绍了Excel中的年金计算函数,它们是全书乃至全部金融计算的 ...

  2. 小时用计算机怎么算,一天24小时在计算机上消耗多少千瓦小时,以及一天中计算机的用电量计算...

    每个人都知道,如果家用电器在运行,它们会消耗一定量的电力,例如您常用的冰箱,中央空调,电视和计算机. 当今的网络编辑是计算机的关键. 换句话说,许多朋友将更加关注一天24小时在计算机上消耗多少千瓦时的 ...

  3. 计算机专业算理算工,计算机在高考时是算文还是算理啊

    类似问题答案 我是文科生,高考时可以报计算机吗 在某些学校可以,某些学校不行,您看看你们省的招生简章吧.但冒昧问一下,您为什么要报计算机,是想当计算机研究者吗?如果这样的话,当然最好报计算机专业,搞个 ...

  4. java34-计算机的发展-计算机硬件-计算机软件-计算机存储规则-计算机的基本操作-CMD-环境变量

    文章目录 计算机的发展 古代的运算工具 机械计算工具 计算机理论 近代计算机的发展 未来计算机发展 计算机硬件 计算机硬件分类 CPU CPU参数 内存 硬盘 显卡 显示器 其他硬件 计算机软件 整体 ...

  5. 不用计算机怎么算根号二,根号怎么打 根号2或3等于多少?

    在数学运算中我们经常需要运算到根号(√),根号看似简单,但要你在电脑中打出根号符号,相信对于很多菜鸟朋友来说并不是一件的简单的事情,虽然在网上有个最简答的方法:直接在网上搜索根号符号,很多网页上均有直 ...

  6. 计算机考研算什么学士学位

    计算机专业本科在读生以及毕业生对于考研这件事,始终心存困惑,计算机考研之后对就业的意义大吗?除了获得研究生学历之外,计算机考研的价值在哪呢?在讨论这些问题之前建议考生先了解下计算机专业考研之后的学历属 ...

  7. 算盘算筹计算机论文,算筹 算盘与计算机.doc

    文档介绍: 算筹_算盘与计算机3算筹.算盘与计算机()傅海伦山东师范大学数学系()3国家自然科学基金资助项目No.10171107关键词算筹算盘算法珠算计算机本文阐述算筹.算盘与计算机的关系:算筹是中 ...

  8. 计算机科学与技术本科相当于计算机几级,软件工程的学生毕业后计算机等级算几级?...

    计算机专业,软件工程等相关专业的人员毕业,都视之达到了国家四级的水平,但是不会像其他专业的同学考级一样,授予四级证书的. 计算机四级是针对计算机的熟练以及掌握程度进行评估的一种国家型等级考试.考试为无 ...

  9. 初中算题可以使用计算机吗,初中生计算机考试试题总汇

    初中生计算机考试试题总汇 1 基础部分选择题 1. 以下与信息有关的设备计算中,用于存 储信息的设备是( B ).A. 光纤电缆 B. 磁带机 C. 通信卫星 D. 路由器 2. 一张加了写保护的软磁 ...

最新文章

  1. 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)
  2. .NET中的枚举(Enum)
  3. 牛客 - 血压游戏(虚树+dp)
  4. JavaScript数组(2)---遍历/迭代方法 8种
  5. established关键字
  6. 前端radio单选框默认选中_开发记录篇前端内容1
  7. 学习笔记 之 JQuery 基础语法
  8. 计网期末复习 - CRC循环冗余校验计算
  9. 大学计算机相关理论,大学计算机理论基础 大学计算机基础理论题.doc
  10. 学用MVC4做网站五:5.2我的文章
  11. SQL进阶教程(一)——CASE表达式
  12. java如何实现英文翻译中文,22年最新
  13. Java项目:Springboot图书馆图书借阅管理系统
  14. 技术大众化--10款无需编程的App DIY开发工具
  15. Java设计模式学习记录-模板方法模式
  16. 2007中国优秀手机客户端软件和无线互联网
  17. uniapp引入font-awsome字体图标-疑难解决
  18. (node)Warning: Accessing non-existent property ‘xxx‘ of module exports inside circular depen
  19. 第七阶段 -- 网页编程基础:【HTML】
  20. 图灵奖得主今日开讲 | Machine Intelligence – Myths and Reality

热门文章

  1. RL串联等效转换为RL并联的方法及其仿真
  2. PCIe | 基础知识点扫盲
  3. Kinect for Unity检测身高方法
  4. 移动端border-radius绘制圆点不圆
  5. command命令大全(转自http://blog.dhedu.gov.cn/u/72/archives/2009/14290.html)
  6. 互联网日报 | 4月14日 星期三 | 贾跃亭被终身禁入证券市场;天猫4月19日起降低开店门槛;小米正式迈入游戏手机细分赛道...
  7. 关于技嘉雷电扩展卡SSDT驱动教程
  8. 三维空间——点线面关系
  9. 计算机专业顶岗实训,计算机专业学生的顶岗实习
  10. 尚元钓(Fishing Game)