主要内容

浮点数字

马铃薯®代表双精度或单精度格式的浮点数。默认为双精度,但您可以使用简单的转换功能进行任何数字单精度。

双精度浮点

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)%转换为双x = -5.8932e + 11

创建单精度数据

因为Matlab将数字数据存储为一个双倍的默认情况下,您需要使用单身的转换函数创建单精度编号:

x =单身(25.783);

谁是函数返回变量的属性X在一个结构。这字节这个结构的场显示了X存储为单个,它需要只需4个字节,与8个字节将其存储为一个双倍的

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

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

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

浮点数的算术运算

本节介绍您可以在算术运算中使用的浮点数的课程。

双精度运算

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

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

  • 双倍的

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

  • char

  • 逻辑

此示例在类型数据上执行算术char双倍的.结果是类型双倍的

c ='大写' -  32;类(c)ans = double char(c)ans =大写

单精度操作

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

  • 单身的

  • 双倍的

  • char

  • 逻辑

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

x =单身([1.32 3.47 5.28])。* 7.5;类(x)ans =单身

浮点类的最大和最小值

为了双倍的单身的类中,你可以用该类型表示最大和最小的数字。

最大和最小的双精度值

Matlab功能realmax.逼真返回您可以使用的最大值和最小值双倍的数据类型:

str ='双倍的范围是:\ n \ t%g to%g,\ n \ t%g to%g';Sprintf(str,-realmax,-realmin,realmin,realmax)ans =双倍的范围是:-1.79769e + 308至-2.22507e-308和2.22507E-308至1.79769E + 308

数字大于realmax.或小于-realmax.分别分配了正无穷大的值:

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

最大,最小的单精度值

Matlab功能realmax.逼真,当与参数调用时'单身的',返回您可以使用的最大值和最小值单身的数据类型:

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 =单负无穷

浮点数据的准确性

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

双精度的准确性

因为只有有限数量的双精度编号,因此您不能代表双精度存储中的所有数字。在任何计算机上,每个双精度数和下一个更大的双精度数之间存在小的差距。您可以使用该差距的大小限制了结果的精度eps.功能。例如,要找到之间的距离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

如果你进入eps.没有输入参数,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并不完全称为二进制部分。因此,以下计算不会给出零,而是揭示数量eps.

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 + 1  -  1E-16;C = 1E-16  -  1E-16 + 1;b == c ans =逻辑0

浮点数之间存在差距。随着数字变得更大,所以差距所以证明是:

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

π不是真的Π,这并不奇怪sin(π)不完全为零:

SIN(PI)ANS = 1.224646799147353E-16

例2 -灾难性取消

当使用几乎相同的操作数执行减法时,有时会出现取消。以下是由沼泽引起的取消的示例(使添加不显着的精度丧失)。

SQRT(1E-16 + 1) -  1NS = 0

Matlab的一些功能,如EXPM1.log1p.,可用于补偿灾难性取消的影响。

示例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]致莫尔,克罗尔。数值计算与马铃薯.纳尼克,马:Mathworks,Inc。,2004年。