浮点型分为单精度(single)浮点型和双精度(double)浮点型;
IEEE浮点数算术标准(IEEE 754)是IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号,等同于国际标准ISO/IEC/IEEE 60559。该标准由美国电气电子工程师学会(IEEE)计算机学会旗下的微处理器标准委员会(Microprocessor Standards Committee, MSC)发布,是最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。
这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number),一些特殊数值(无穷与非数值(NaN)),以及这些数值的“浮点数运算子”,它也指明了四种数值修约规则和五种例外状况(包括例外发生的时机与处理方式)。
任何存储为double格式的值都需要64位,格式如下:
位 |
用法 |
|
符号( |
|
指数 |
|
小数位(分数位) |
任何存储为single格式的值都需要32位,格式如下:
位 |
用法 |
|
|
|
指数 |
|
小数位(分数位) |
创建双精度浮点数使用double函数,创建单精度浮点数使用单精度single函数;
程序示例:
double(1) %创建双精度浮点型1
a=1 %默认双精度浮点型,再赋值给a
single(1) %单精度1
测试浮点型数据的取值范围最大值和最小值分别使用realmax和realmin函数;
程序示例:
realmax('double') %双精度最大取值范围
[-realmax,-realmin,realmin,realmax] %完整的双精度取值范围(-0和0之间取不到任何值)
[-realmax('single'),-realmin('single'),realmin('single'),realmax('single')]
%单精度浮点型取值范围,上式未指定则默认取双精度浮点型范围
判断是否为浮点型使用isfloat函数,测试一个变量的数据类型使用class函数;
程序示例:
a=1
isfloat(a) %判断是否浮点型
class(a) %测试变量a的数据类型
c=int8(1) %整型1
c1=double(c) %整型转化为双精度,数据类型创建方法也是转化方法
c2=single(c) %转化为单精度
int8(c1) %双精度转化为整型
whos c c1 c2 %查看数据类型:双精度8字节精度最高
先看一组程序示例:
(4/3-1)*3-1 %结果不是0
sin(pi) %结果不是0
说明,大家可以在Matlab运行上面两行代码看一下结果,是不是有点意外;
在Matlab中,几乎所有的运算,默认都是以符合IEEE 754标准的双精度算法执行的,由于计算机只能以有限的精度表示数字(双精度要求52个尾数位),对于数值运算,这种浮点型表示值与其真实值存在微小的差异;
所以,如果浮点算术运算的结果不如预期的那样精确,甚至有时会产生数学上非直觉的结果,则很可能是由于计算机硬件的限制造成的,硬件可能没有足够的位来表示结果的完全准确性,因此仅截取了结果值的部分精度;
但这并不是matlab中的错误,运用IEEE 754标准所执行的所有计算都受到影响,其中包括用C或FORTRAN等;
eps函数默认求数值1的精度,求得的结果是计算机表达1这个数值时,由于硬件限制产生的误差值,因为计算机有限位数只能存储有限精度;
程序示例(建议打开Matlab练习体会)
1
eps
1+eps %返回结果1,即eps视为和1之间没有再存储其他数值,返回1
eps(10) %10附近的精度
eps(100) %100附近的精度
eps(single(100)) %单精度100附近的精度
程序示例:
(4/3-1)*3-1 %4/3并非完整精确的分数,而是有限存储空间内的近似值,因此结果并非0
(sym(4/3)-1)*3-1 %返回0,引入符号型获得精确4/3值
sin(pi) %圆周率pi会保留部分精度的小数再进行计算,因此结果有误差
sin(sym(pi)) %sym将pi转化为符号型再求sin值,结果是0
Matlab自学笔记十三 数据类型:整型,创建方法、取值范围、整型运算、常用函数、程序示例https://blog.csdn.net/freexyn/article/details/128362178Matlab自学笔记九:算术运算、数组运算、矩阵运算、运算符、常用函数、程序示例
https://blog.csdn.net/freexyn/article/details/127948563
1.23/Matlab浮点型数据类型/计算sin(pi)≠0/你知道原因吗
End