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