主要内容

浮点数

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

双精度浮点

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

使用

63.

号(0.=正面,1= -)

62.52.

指数,偏见1023.

51.0.

分数F的数量1.度

单精度浮点

MATLAB构造单精度(或单身的)根据IEEE标准754的数据类型,用于单精度。任何值存储为a单身的需要32位,格式化如下表所示:

使用

31.

号(0.=正面,1= -)

30.23.

指数,偏见127.

22.0.

分数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 =单个(y)%转换为单个x = lein -5.8932e + 11

浮点数的算术运算

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

双精度运算

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

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

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

  • 字符

  • 逻辑

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

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

单精确操作

您可以使用基本的算术运算单身的以及其他任何类。结果总是单身的

  • 单身的

  • 字符

  • 逻辑

在此示例中,7.5默认为类型,其结果为类型单身的

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.分别赋值为正无穷和负无穷:

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

最大和最小的单精度值

Matlab功能最大浮点数最小正浮点数,当与参数一起调用时“单一”,返回您可以使用的最大值和最小值单身的数据类型:

str ='单一的范围是:\ n \ t%g to%g,\ n \ t%g to%g';Sprintf(str,-realmax('单'),-realmin('单'),... realmin('单'),realmax('单'))ans =单身的范围是:-3.40282e + 38至-1.17549E-38和1.17549E-38至3.40282E + 38

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

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

浮点数据的准确性

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

双精度的准确性

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

格式长期EPS(5)ANS = 8.881784197001252E-16

这告诉你,5之间没有双重精度数字5 + eps (5).如果双精度计算返回答案5,则结果仅精确到内部EPS(5)

的价值EPS(x)取决于X.这个例子说明了X变得更大,所以EPS(x)

EPS(50)ANS = 7.105427357601002E-15

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

单精度精度

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

x =单(5);EPS(x)

回报

ANS =单次4.7684E-07

请注意,此结果大于EPS(5).因为单精度数量少于双精度数,所以单精度数字之间的间隙大于双精度数字之间的间隙。这意味着在单精度算术中导致比双精度算术的精确度较低。

X类型EPS(单(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警告如下矩阵一种是不良状态,因此系统斧= 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。