主要内容

浮点数

MATLAB®以双精度或单精度格式表示浮点数。默认值是双精度,但您可以使用一个简单的转换函数使任何数字成为单精度。

双精度浮点

MATLAB构建双精度(或)根据IEEE的数据类型®标准754用于双精度。存储为需要64位,格式如下表所示:

使用

63

号(0=正,1= -)

6252

指数,偏见1023

510

分数f的数量1.度

单精度浮点

MATLAB构造单精度(或单一的)数据类型符合IEEE标准754的单精度要求。任何存储为单一的需要32位,格式如下表所示:

使用

31

号(0=正,1= -)

3023

指数,偏见127

220

分数f的数量1.度

因为MATLAB存储类型的数字单一的使用32位,它们需要的内存比类型数量要少,它使用64位。但是,由于它们存储的位较少,因此单一的表示的精度低于类型数

创建浮点数据

使用双精度存储大于约3.4 x 10的值38或小于约-3.4 × 1038.对于介于这两个限制之间的数字,您可以使用双精度或单精度,但单精度需要的内存更少。

创建双精度数据

因为MATLAB的默认数值类型为,您可以创建使用简单的赋值语句:

x = 25.783;

这个函数显示MATLAB创建了一个1乘1类型的数组对于刚才存储的值x:

whoos x Name Size Bytes Class x 1x1 8 double

使用isfloat如果你只是想验证一下x是浮点数。这个函数返回逻辑1 (真正的)如果输入是浮点数,则为逻辑0(),否则:

isfloat(x)ans=逻辑1

可以使用MATLAB函数将其他数字数据、字符或字符串和逻辑数据转换为双精度,. 此示例将有符号整数转换为双精度浮点:

y = int64 (-589324077574);%创建一个64位整数x = double(y) %转换为double x = -5.8932e+11

创建单精度数据

因为MATLAB将数值数据存储为默认情况下,您需要使用单一的用于创建单个精度数字的转换函数:

x=单个(25.783);

这个函数返回变量的属性x在一个结构。这个字节这个结构的场显示了x存储为一个,它只需要4个字节,而存储为一个:

xAttrib=whos('x');xAttrib.bytes ans=4

可以使用将其他数字数据、字符或字符串以及逻辑数据转换为单精度单一的功能。此示例将有符号整数转换为单精度浮点:

y=int64(-589324077574);%创建一个64位整数x=single(y)%Convert to single x=single-5.8932e+11

浮点数的算术运算

本节描述在浮点数的算术运算中可以使用哪些类。

双精度运算

可以使用执行基本算术运算以及其他任何类。当一个或多个操作数是整数(标量或数组)时操作数必须是标量。结果是类型的,除非另有说明:

  • 单一的-结果是类型单一的

  • int*尤因*—结果具有与整型操作数相同的数据类型

  • 字符

  • 符合逻辑的

这个例子对类型的数据执行算术运算字符.结果是类型的:

C = '大写' - 32;class(c) ans = double char(c) ans = UPPERCASE

单精确操作

可以使用执行基本算术运算单一的以及其他任何类。结果总是单一的:

  • 单一的

  • 字符

  • 符合逻辑的

在本例中,7.5默认为type,其结果为类型单一的:

X = single([1.32 3.47 5.28]) .* 0.5;Class (x) ans = single

浮点类的最大值和最小值

对于单一的类中,你可以用该类型表示最大和最小的数字。

最大和最小双精度值

这个MATLAB函数最大浮点数最小正浮点数返回可以用表示的最大值和最小值数据类型:

str = ' double的范围是:\n\t%g到%g和\n\t%g到%g';sprintf(str, -realmax, -realmin, realmin, realmax) ans = double的范围是:-1.79769e+308到-2.22507e-308和2.22507e-308到1.79769e+308

数字大于最大浮点数或小于-雷马克斯分别赋值为正无穷和负无穷:

realmax+.0001e+308ans=Inf-realmax-.0001e+308ans=-Inf

最大和最小的单精度值

这个MATLAB函数最大浮点数最小正浮点数,当与参数一起调用时“单一”,返回可以用表示的最大值和最小值单一的数据类型:

str='单个的范围是:\n\t%g到%g和\n\t%g到%g';sprintf(str,-realmax('single')、-realmin('single')、…realmin('single')、realmax('single'))ans=单体的范围为:-3.40282e+38至-1.17549e-38和1.17549e-38至3.40282e+38

数字大于最大浮点数(单)或小于-realmax('single')分别赋值为正无穷和负无穷:

最大浮点数(单)+ .0001e + 038 ans =单正最大浮点数(单)- .0001e + 038 ans =单负无穷

浮点数据的准确性

如果浮点算术计算的结果不像您预期的那样精确,则很可能是由于计算机硬件的限制造成的。也许,你的结果不那么精确,因为硬件没有足够的位来表示完美的结果;因此,它截断了结果值。

双精度的准确性

因为双精度数字的数量是有限的,所以不能表示双精度存储中的所有数字。在任何计算机上,每个双精度数和下一个更大的双精度数之间都有一个小的差距。您可以确定这个差距的大小,这将限制您的结果的精度,使用每股收益函数。例如,查找5然后输入下一个较大的双精度数字

格式长eps(5)ans=8.881784197001252e-16

这说明在5和5之间没有双精度数字5 + eps (5).如果双精度计算返回答案5,则结果仅精确到内部每股收益(5)

的价值每股收益(x)取决于x.这个例子说明了x变得更大,所以每股收益(x):

eps(50)ans=7.105427357601002e-15

如果你输入每股收益如果没有输入参数,MATLAB将返回每股收益(1),距离1到下一个更大的双精度数字。

单精度精度

类似地,任意两个单精度数之间也有间隔。如果x有类型单一的,每股收益(x)返回x和下一个更大的单精度数。例如,

x=单个(5);每股收益(x)

返回

ans=单个4.7684e-07

请注意,此结果大于每股收益(5). 由于单精度数少于双精度数,因此单精度数之间的间距大于双精度数之间的间距。这意味着单精度算法的结果不如双精度算法的结果精确。

x类型,每股收益(单个(x))给你一个上限x从转换时,将其舍入单一的.例如,当您转换双精度数时3.14单一的,它被包围了

双(单(3.14)- 3.14)ans = 1.0490e-07

的数量3.14四舍五入是小于

eps(单个(3.14))ans=单个2.3842e-07

避免浮点运算的常见问题

在MATLAB中,几乎所有的运算都采用符合IEEE标准754的双精度算法。由于计算机只能以有限的精度表示数字(双重精度需要52个尾数位),计算有时会产生数学上不直观的结果。值得注意的是,这些结果并不是MATLAB中的错误。

使用下面的例子来帮助您识别这些情况:

例子1 -四舍五入或者你得到的不是你期望的

十进制数4/3不能精确地表示为二元分数。由于这个原因,下面的计算不会给出零,而是揭示了数量每股收益

e=1-3*(4/3-1)e=2.2204e-16

同样的,0.1不能确切地用二进制数表示。因此,你会得到以下非直觉行为:

一个= 0.0;For I = 1:10 a = a + 0.1;结束a == 1 ans =逻辑0

注意,在计算过程中,操作的顺序很重要:

B = 1e-16 + 1e-16;C = 1e-16 - 1e-16 + 1;B == c =逻辑0

浮点数之间存在间隙。随着数字越来越大,差距也越来越大,如下所示:

(2^53 + 1) - 2^53 = 0

π难道真的不是π,这不奇怪吗sin(π)不完全为零:

Sin (pi) ans = 1.224646799147353e-16

例2 -灾难性取消

当使用几乎相等的操作数执行减法时,有时会意外地发生取消操作。下面是由淹没(精度的损失使添加变得不重要)引起的取消的示例。

√(1e-16 + 1) - 1ans = 0

MATLAB中的一些函数,如expm1log1p,可用于补偿灾难性取消的影响。

例3 -浮点运算和线性代数

在解决线性代数问题时,四舍五入、取消和浮点运算的其他特性结合起来产生惊人的计算。MATLAB警告如下矩阵A是病态的,因此系统Ax=b可能对小扰动敏感:

A = diag([2 eps]);b = [2;每股收益);y = \ b;警告:矩阵是接近单数或严重缩放。结果可能不准确。RCOND = 1.110223 e-16。

这些只是显示IEEE浮点算法如何影响MATLAB计算的几个示例。请注意,IEEE 754算法中执行的所有计算都会受到影响,这包括用C或FORTRAN编写的应用程序以及MATLAB。

参考文献

[1] 摩尔,克利夫。“浮动点.”MATLAB新闻与笔记.秋天,1996。

[2] 摩尔,克利夫。数值计算与MATLAB.马纳提克:MathWorks, Inc., 2004。