浮点数

这是一个由两部分组成的系列文章的第一部分对单-和双精度浮点数,MATLAB使用几乎所有的算术运算。(这篇文章改编自1.7节我的书与MATLAB数值计算由MathWorks出版和暹罗)。

内容

IEEE 754 - 1985标准

如果你仔细观察的定义基本算术运算和加法和乘法一样,您很快就会遇到数学抽象实数。但实际计算与实际数字不是很实用,因为它涉及到观念限制和无穷大。相反,MATLAB和大多数其他技术计算环境中使用浮点运算,其中包括一组有限的数字与有限的精度。这就导致的现象舍入,下溢,溢出。大多数时候,可以使用MATLAB有效而不用担心这些细节,但是,每隔一段时间,知道一些关于浮点数的性质和局限性。三十年前,情况远比今天更复杂。每台计算机都有自己的浮点数系统。有些是二进制;有些是小数。甚至有一个俄罗斯的计算机使用三重的算术。在二进制的电脑,一些使用2为基础;其他人使用8或16。每个人都有不同的精度。 In 1985, the IEEE Standards Board and the American National Standards Institute adopted the ANSI/IEEE Standard 754-1985 for Binary Floating-Point Arithmetic. This was the culmination of almost a decade of work by a 92-person working group of mathematicians, computer scientists, and engineers from universities, computer manufacturers, and microprocessor companies. A revision of IEEE_754-1985, known asIEEE 754 - 2008,于2008年出版。修订结合二进制标准在754年和小数点在另一个文档标准,854年。但据我所知,修订中引入的新功能没有太大影响。

Velvel卡亨

的主要建筑师威廉·m·卡亨是IEEE浮点运算。我一直知道他的外号“Velvel”。我见到他在1960年代初,当我是一个斯坦福大学研究生,他是一个年轻的教员在多伦多大学。他从多伦多搬到加州大学伯克利分校在1960年代末,在伯克利度过了自己职业生涯的剩余时间。他现在是一个名誉教授数学和电子工程和计算机科学。Velvel是一个杰出的数值分析。在许多其他的成就,他是开发人员以及基因Golub第一实际计算奇异值分解算法。在1970年代末的微处理器制造商包括英特尔、摩托罗拉、和德州仪器开发的芯片最终成为个人电脑的基础和今天的电子产品。在一个非凡的竞争对手之间的合作,他们建立了一个委员会来开发一个浮点运算的通用标准。Velvel是英特尔、咨询与约翰•帕默一个斯坦福大学研究生的主要建筑师8087数学协处理器。 The 8087 accompanied the 8086, which was to become the CPU of the IBM PC. Kahan and Palmer convinced Intel to allow them to release the specs for their math coprocessor to the IEEE committee. These plans became the basis for the standard. Velvel received the ACM Turing Award in 1989 for "his fundamental contributions to numerical analysis". He was named an ACM Fellow in 1994, and was inducted into the National Academy of Engineering in 2005.

单引号和双精度

自1985年以来所有计算机设计使用IEEE浮点运算。这并不意味着他们都得到完全相同的结果,因为有一些灵活性的标准。但这的确意味着,我们现在有一个独立于机器的浮点运算的行为的模型。MATLAB传统上使用IEEE双精度格式。近年来,单精度格式也可用。这可以节省空间和有时会更快。还有一个扩展精度格式,这不是精确指定的标准,这可能是用于浮点硬件的中间结果。这是一个缺乏一致性的来源在不同的机器上。大多数非零浮点数是标准化的。这意味着他们可以表示为$ $ x = (1 + f)下午\ \ cdot 2 ^ e量f美元是美元分数尾数和e是一美元指数。分数满足$ $ 0 \ leq f < 1 $ $ $ f $比例必须可表示的二进制使用最多52位双精度和23位单取消。换句话说,双,2美元^ {52}f是一个整数美元区间$ $ 0 \ leq 2 ^ {52} f < 2 ^{52} $ $单,2美元^ {23}f是一个整数美元区间$ $ 0 \ leq 2 ^ {23} f < 2 ^{23} $ $为双精度,美元指数e是一个整数的间隔-1022美元\ leq e \ leq单1023美元,美元指数e在美元区间\ leq e \ leq 127美元-126美元

精度和范围

f是一个美元的有限性限制精度。e是一个美元的有限性限制范围。任何不符合这些限制的数据必须由那些近似。

浮点数格式

双精度浮点数存储在一个64位的词,对$ f $ 52位,e美元的11位,1位数字的符号。e美元的符号是通过存储e + 1023美元,也就是1美元和美元之间2 ^{11}2美元。2极端值指数,$ 0 $和$ 2 ^{11}1美元,是留给特别的浮点数,稍后我将描述。单精度浮点数存储在一个32位的字,对$ f $ 23位,8位,e,美元和1位数量的迹象。e美元的符号是通过存储e + 127美元,也就是1美元和美元之间2 ^{8}2美元。再次,指数2极端值字段保留为杰出的浮点数。整个一个浮点数的小数部分不是f美元,但1 + f美元。然而,领先1美元不需要存储。实际上,IEEE格式包33美元或65美元信息到32美元或64美元美元一些词。

floatgui

我的程序floatgui,可以在这里显示正数的分布在一个浮点变量参数系统模型。参数t美元指定用于存储f美元的比特数。换句话说,2 ^ t f美元是一个整数。参数$ e_{分钟}$和$ e_{马克斯}指定范围的美元指数,所以美元e_{分钟}\ leq e \ leq e_{马克斯}$。最初,floatgui集t = 3美元,美元e_{分钟}= 4美元,美元e_{马克斯}= 2美元,产生以下分布。在每个二进制间隔2美元^ e x \ \ leq leq 2 ^ {e + 1} $,数字是等距的2美元的增量^ {e-t} $。如果$ e = 0, t =美元3美元,例如,间距之间的数字$ 1 $和$ 2 $ 1/8美元。随着e美元增加,间距增加。这也是有益的显示浮点数对数刻度。这里的输出floatgui对数刻度检查和t = 5美元,美元e_{分钟}= 4美元,美元e_{马克斯}= 3美元。对数刻度,更明显的是,分布在每个二进制间隔是一样的。

每股收益

一个非常重要的数量与浮点运算是用红色突出显示的floatgui。MATLAB调用这个量每股收益的缩写机ε
  • 每股收益是距离从1美元到下一个更大的浮点数。
floatgui浮点模型系统,每股收益2 = $ ^ {- t} $。在IEEE标准,不同的机器有不同的值每股收益。现在,IEEE双精度的近似十进制值每股收益
格式格式紧凑的eps_d =每股收益
eps_d = 2.2204 e-16
单精度,
eps_s =每股收益(“单一”)
eps_s = 1.1921 e-07
要么eps / 2每股收益可以被称为凑整水平。最大相对误差发生当一个算术运算的结果四舍五入为最接近的浮点数eps / 2。最大的相对间距的数字每股收益。在这两种情况下,你可以说凑整水平大约是16个小数位数双7单的小数位数。实际上每股收益是一个函数。每股收益(x)是距离abs (x)到下一个更大的大小相同的精度的浮点数x

十分之一

一个经常发生的例子是简单的MATLAB提供的声明
t = 0.1
数学值t存储在美元t不是因为表达小数1/10美元0.1美元美元以二进制需要一个无穷级数。事实上,$ $ \压裂{1}{10}= \压裂{1}{2 ^ 4}+ \压裂{1}{2 ^ 5}+ \压裂{0}{2 ^ 6}+ \压裂{0}{2 ^ 7}+ \压裂{1}{2 ^ 8}+ \压裂{1}{2 ^ 9}+ \压裂{0}{2 ^{10}}+ \压裂{0}{2 ^{11}}+ \压裂{1}{2 ^ {12}}+ \ cdots $ $第一项后,系数序列1美元,0,0,1美元经常重复无限。分组结果四个在一起时间表达1/10 n基地16美元,或十六进制系列。$ $ \压裂{1}{10}= 2 ^ {4}\ cdot \离开(1 + \压裂{9}{16}+ \压裂{9}{16 ^ 2}+ \压裂{9}{16 ^ 3}+ \压裂{9}{16 ^ {4}}+ \ cdots \右)$ $浮点数的1/10是通过美元后终止本系列的小数部分52美元二进制条款,或13个十六进制的条件,和舍入向上或向下的最后一学期了。因此$ $ t_1 < 1/10 < t_2 $ $ $ $ t_1 = 2 ^ {4} \ cdot \离开(1 + \压裂{9}{16}+ \压裂{9}{16 ^ 2}+ \压裂{9}{16 ^ 3}+ \ cdots + \压裂{9}{16 ^{12}}+ \压裂{9}{16 ^{13}}\右)$ $ $ $ t_2 = 2 ^ {4} \ cdot \离开(1 + \压裂{9}{16}+ \压裂{9}{16 ^ 2}+ \压裂{9}{16 ^ 3}+ \ cdots + \压裂{9}{16 ^{12}}+ \压裂{10}{16 ^{13}}\右)原来1/10美元美元接近t_2比t_1美元美元,美元因此t等于t_2美元美元。换句话说,$ $ t = (1 + f) \ cdot 2 e ^ $ $ $ $ f = \压裂{9}{16}+ \压裂{9}{16 ^ 2}+ \压裂{9}{16 ^ 3}+ \ cdots + \压裂{9}{16 ^{12}}+ \压裂{10}{16 ^ {13}}$ $ $ $ $ $ e = 4

十六进制格式

MATLAB命令
格式十六进制
原因t将显示为
3 fb999999999999a
的字符一个通过f表示十六进制数字“10到15。前三个字符,3 fb,给的十六进制表示十进制1019美元,这是有偏见的价值指数e + 1023美元如果e是4美元美元。其他13个字符的十六进制表示分数f美元。总之,中存储的值t非常接近,但不完全等于0.1美元美元。偶尔的区别是重要的。例如,数量
0.3/0.1
并不完全等于3美元,因为实际的分子是略低于0.3美元美元,实际的分母是大于0.1美元。十个步骤的长度t不完全相同的长度为1的一个步骤。MATLAB是谨慎地安排最后一个元素的向量
0:0.1:1
正好等于1美元,但如果你这个向量形式的重复添加0.1美元美元,你将错过打最后的1美元。

黄金比例

浮点数的近似黄金比例,\φ,美元看起来像什么?
格式十六进制φ= (1 +√5)/ 2
φ= 3 ff9e3779b97f4a8
第一个十六进制数字3,是0011年在二进制。第一位是符号浮点数;0是正的,1是负的。所以φ是正的。剩余的前三个十六进制数字包含e + 1023美元。在这个例子中,3 ff在基地16美元3 \ cdot 16 ^ 2 + 15 \ cdot 16 + 15 = 1023美元小数。所以$ $ e = 0 $ $事实上,任何浮点数1.0美元和2.0美元之间的e = 0美元,所以它的十六进制输出以3 ff。其他13个十六进制数字包含$ f $。在这个例子中,$ $ f = \压裂{9}{16}+ \压裂{14}{16 ^ 2}+ \压裂{3}{16 ^ 3}+ \ cdots + \压裂{10}{16 ^{12}}+ \压裂{8}{16 ^{13}}$ $的这些值f e美元,美元$ $ (1 + f) 2 ^ e \大约\φ$ $

计算每股收益

另一个例子是由下面的代码段。
格式一个= 4/3 b = c - 1 = 3 * b e = 1 - c
0.333333333333333 = 1.333333333333333 b = c = 1.000000000000000 e = 2.220446049250313 e-16
与精确计算,e将是零。但与浮点,我们获得双精度每股收益。为什么?事实证明,唯一凑整发生在第一个语句的部门。商不能完全4/3美元,除了俄罗斯三重的电脑。因此中存储的值一个接近,但不完全等于,4/3美元。的减法b = - 1产生一个数量b的最后一位是0。这意味着乘法3 * b可以做的没有舍入。中存储的值c并不完全等于1美元,所以中存储的值e不是0。IEEE标准之前,这段代码是作为一个快速的方法来估计凑整级别在不同的电脑。

下溢和溢出

舍入级每股收益有时被称为“浮点零,“但这是一个误称。有许多浮点数远小于每股收益。最小的积极的规格化的浮点数f = 0美元,e = -1022美元。最大的浮点数f一点美元不到$ 1 $和$ e = 1023美元。MATLAB调用这些数字最小正浮点数最大浮点数。在一起每股收益他们描述的标准系统。
双精度二进制小数eps 2 ^ (-52) 2.2204 e-16最小正浮点数2 ^ (-1022)2.2251 e - 308最大浮点数(2-eps) * 2 ^ 1023 1.7977 e + 308
单精度二进制小数eps 2 ^ (-23) 1.1921 e-07最小正浮点数2 ^ 1.1755(-126)38吗最大浮点数(2-eps) * 2 ^ 127 3.4028 e+38
如果任何计算试图产生一个值大于最大浮点数,是说溢出。结果是一个特殊的浮点值。它是由e = 1024美元和f = 0美元和满足的关系1 /正= 0正+正=正无穷。如果任何计算试图产生一个值未定义甚至在实数系统,结果是一个例外值不是一个数字,或。例子包括0/0Inf-Inf表示通过e = 1024 $和$ f 0美元。如果任何计算试图产生一个值小于最小正浮点数,是说下溢。这涉及到最具争议的方面之一IEEE标准。它产生异常denormal低于正常的浮点数之间的时间间隔最小正浮点数eps *最小正浮点数。最小的积极的双精度数低于正常
格式smallest_d =每股收益*最小正浮点数smallest_s =每股收益(“单一”)*最小正浮点数(“单一”)
smallest_d = 4.9407 e - 324 smallest_s = 1.4013 e-45
任何结果小于该设置为0。引起的争议下溢和denormals将我的下一个博客的主题。

发表与MATLAB®R2014a

|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。