MATLAB®以双精度或单精度格式表示浮点数。默认值是双精度,但您可以使用一个简单的转换函数使任何数字成为单精度。
MATLAB构建双精度(或双
)根据IEEE的数据类型®标准754用于双精度。存储为双
需要64位,格式如下表所示:
位 |
使用 |
---|---|
|
号( |
|
指数,偏见 |
|
分数 |
MATLAB构造单精度(或单一的
)数据类型符合IEEE标准754的单精度要求。任何存储为单一的
需要32位,格式如下表所示:
位 |
使用 |
---|---|
|
号( |
|
指数,偏见 |
|
分数 |
因为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中的错误。
使用下面的例子来帮助您识别这些情况:
十进制数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
当使用几乎相等的操作数执行减法时,有时会意外地发生取消操作。下面是由淹没(精度的损失使添加变得不重要)引起的取消的示例。
√(1e-16 + 1) - 1ans = 0
MATLAB中的一些函数,如expm1
和log1p
,可用于补偿灾难性取消的影响。
在解决线性代数问题时,四舍五入、取消和浮点运算的其他特性结合起来产生惊人的计算。MATLAB警告如下矩阵A
是病态的,因此系统Ax=b
可能对小扰动敏感:
A = diag([2 eps]);b = [2;每股收益);y = \ b;警告:矩阵是接近单数或严重缩放。结果可能不准确。RCOND = 1.110223 e-16。
这些只是显示IEEE浮点算法如何影响MATLAB计算的几个示例。请注意,IEEE 754算法中执行的所有计算都会受到影响,这包括用C或FORTRAN编写的应用程序以及MATLAB。