文档

浮点数

MATLAB®以双精度或单精度格式表示浮点数。默认情况下是双精度,但是您可以使用一个简单的转换函数来实现任意数字的单精度。

双精度浮点

MATLAB构造双精度(or))根据IEEE数据类型®双精度标准754。存储为任意值需要64位,格式如下表所示:

使用

63

号(0=正,1= -)

6252

指数,偏见1023

510

分数F的数量1.度

单精度浮点

MATLAB构造单精度(或)根据IEEE标准754单精度)数据类型。存储为任意值需要32位,格式为示于下表中:

使用

31

号(0=正,1= -)

三十23

指数,偏见127

220

分数F的数量1.度

由于MATLAB门店数量型使用32位,它们需要的内存比类型数更少,它使用64位。然而,因为它们存储有较少的位,类型的号码被表示为比类型的数字精度要求不高

创建浮点数据

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

创建双精度数据

因为对于MATLAB默认数值类型是,您可以创建一个用一个简单的赋值语句:

x = 25.783;

谁是功能显示,MATLAB创造了一个1×1的阵列型的为您刚才存储的值X

名称大小字节类x 1x1 8倍

使用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 =卫生组织( 'X');xAttrib.bytes ANS = 4

可以使用其它数字数据,字符或字符串,和逻辑数据转换成单精度功能。本例将带符号的整数,以单精度浮点:

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

浮点数的算术运算

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

双精度运算

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

  • - 其结果是类型的

  • INT *UINT *-结果的数据类型与integer操作数相同

  • 字符

  • 合乎逻辑

此示例对类型的数据执行算术运算字符。结果是类型

c = '大写' - 32;类(c) ans =双字符(c) ans =大写

单精确操作

您可以执行基本的算术运算与以及其他课程。结果总是

  • 字符

  • 合乎逻辑

在此实例中,7.5的默认值输入,结果为类型

x = single([1.32 3.47 5.28]) .* 7.5;类(x) ans =单

最大值和最小值浮点类

为了类中,可以使用该类型表示最大和最小的数字。

最大和最小的双精度值

MATLAB功能最大浮点数最小正浮点数返回的最大值和最小值,你可以与代表数据类型:

str = ' double的范围是:\n\t%g到%g和\n\t%g到%g';sprintf(str, -realmax, -realmin, realmin, realmax) ans =范围为:-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 \吨%g至%克和\ n \吨%g到%G';的sprintf(STR,-realmax( '单'),-realmin( '单'),... realmin( '单'),realmax( '单'))ANS =范围为单是:-3.40282e + 38到-1.17549e-38和1.17549e-38到3.40282e + 38

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

realmax('single') - .0001e+038 ans = single -Inf

浮点数据的准确性

如果浮点算术计算的结果不如预期的那么精确,可能是由于计算机硬件的限制造成的。可能,你的结果不太精确,因为硬件没有足够的比特来代表完美的准确性结果;因此,它截断了结果值。

双精度的准确性

因为双精度数字的数量是有限的,所以不能表示双精度存储中的所有数字。在任何计算机上,每个双精度数和下一个更大的双精度数之间都有一个小的差距。方法可以确定此差距的大小,此差距限制了结果的精度每股收益功能。例如,要找到之间的距离而下一个较大的双精度数,输入

格式长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中的bug。

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

例1 -舍入或者你得到的不是你所期望的

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

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

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

一个= 0.0;为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 ans = 0

π不是真正的大众教育,这不奇怪吗sin(π)并不是零:

sinpi ans = 1.224646799147353e-16

例2 -灾难性取消

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

根号(1e-16 + 1) -1 ans = 0

在MATLAB的一些功能,如expm1log1p中,可以使用以补偿灾难性消除的影响。

示例3—浮点运算和线性代数

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

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

这些只是一小部分显示IEEE浮点运算如何影响MATLAB计算的例子。请注意,所有的计算在IEEE 754算法的影响进行的,这包括用C或FORTRAN,以及MATLAB应用程序。

参考文献

[1] Moler,克利夫。“浮动点MATLAB新闻与注释。秋天,1996。

[2] Moler,克利夫。数值计算与MATLAB。纳提克,MA:MathWorks公司,2004年。

这个话题有用吗?