马铃薯®代表双精度或单精度格式的浮点数。默认为双精度,但您可以使用简单的转换功能进行任何数字单精度。
matlab构建了双重精度(或双倍的
)根据IEEE的数据类型®双精度标准754。任何值存储为a双倍的
需要64位,如下表所示格式化:
比特 |
用法 |
---|---|
|
符号 ( |
|
指数,偏见 |
|
分数 |
Matlab构建单精度(或单身的
)根据IEEE标准754的数据类型,用于单精度。任何值存储为a单身的
需要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)%转换为双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中的错误。
使用以下示例可帮助您识别以下情况:
十进制数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
当使用几乎相同的操作数执行减法时,有时会出现取消。以下是由沼泽引起的取消的示例(使添加不显着的精度丧失)。
SQRT(1E-16 + 1) - 1NS = 0
Matlab的一些功能,如EXPM1.
和log1p.
,可用于补偿灾难性取消的影响。
浮点算术结合的圆形,取消和其他特征,在解决线性代数问题时产生惊人的计算。Matlab警告以下矩阵一种
是不良状态,因此系统斧= B.
可能对小扰动敏感:
A = diag([2 eps]);b = [2;每股收益);y = \ b;警告:矩阵是接近单数或严重缩放。结果可能不准确。RCOND = 1.110223 e-16。
这些只是示出IEEE浮点算术如何影响MATLAB的计算的一些示例。注意,在IEEE 754算术中执行的所有计算都会受到影响,这包括用C或FORTRAN编写的应用以及MATLAB。