MATLAB小数(浮点数)类型

MATLAB 用双精度或单精度格式表示浮点数,默认格式是双精度,但可以用转换函数转换为单精度。

如果某个数据没有被指定数据类型,那么 MATLAB 会用双精度浮点数来存储它。为了得到其他类型的数值类型,可以使用类型转换函数。

MATLAB 中的双精度浮点数和单精度浮点数均采用 IEEE 754 中规定的格式来定义。其表示范围、存储大小和类型转换函数如下表所示。

浮点数的数据类型和表示范围
数据类型名称 存储大小 表示范围 类型转换函数
双精度浮点数 4 字节 -1.79769 × 10308 ~+ 1.79769 ×10308 double()
单精度浮点数 8 字节 -3.40282 × 1038 ~+ 3.40282 × 1038 single()

双精度浮点数

MATLAB 按照 IEEE 754 标准构造双精度型数据。作为双精度存储的任何数据,都需要 64 位,其格式如下表所示。

双精度数格式
用途
63 符号,0 = 正,1 = 负
62~52 指数,偏差值为 1023
51~0 数 1.f 的小数 f
想进一步了解小数存储格式的读者,请转到《小数在内存中是如何存储的,揭秘诺贝尔奖级别的设计(长篇神文)》。

最大和最小的双精度值

MATLAB 的 realmax() 和 realmin() 函数返回能够表示的最大和最小双精度值,例如:
>> str = 'The range for double is : \n\t%g to %g';
>> sprintf(str, realmin, realmax)
ans = 
    The range for double is:
        2.22507e-308 to 1.79769e+308
本例中定义了字符串 str,str 字符串的后半部分\n\t%g to %g用于规定输出格式,称其为格式字串(format string),这与 C语言基本相同。

其中 \n 和 \t 是转义字符(Escape Character);转义字符是一种特殊的字符常量,它们以反斜杠\开头,后面跟一个或几个字符。它们具有特定的含义,不同于字符原有的意义,故称“转义”字符。

常用的转义字符在下表中列出:

常用转义字符
转义字符 说明
\n 换行,将当前位置移到下一行开头
\t 水平制表(跳到下一个 TAB 位置)
\b 退格,将当前位置移到本行的开头
\r 回车,将当前位置移到本行开头
\f 换页,将当前位置移到本行开头
\\ 代表一个反斜杠字符“\”
\' 代表一个单引号(撇号)字符
\" 代表一个双引号字符
\ddd 1 到 3 位八进制数所代表的 ASCII 字符
\xhh 1 到 2 位十六进制数所代表的的 ASCII 字符

在上面代码中,sprintf() 函数的作用是将规定输出格式的数值写入到字符串的 str 中,成为字符串 str 的一部分。其中 %g 是用于规定输出格式的字符串,称为格式转换字符(Conversion Character),其位置将被后面的 realmin() 和 realmax() 的值所取代。%g 规定输出格式是“紧凑指数形式”。

常用的格式转换字符在下表中列出:

常用格式转换字符
格式转换字符 说明
%c 单字符
%d 有符号的十进制数
%e e 指数形式,欧拉数用小写(e)
%E e 指数形式,欧拉数用大写(E)
%f 定点数形式
%g %e 或 %f 的紧凑格式,不显示多余的零
%G 与 %g 相同,但用大写 E
%o 八进制(octal)数形式
%s 字符串
%u 十进制(decimal)数形式
%x 十六进制数形式,用小写字母 a~f
%X 十六进制数形式,用大写字母 A~F

建立双精度数

因为 MATLAB 默认数值型数据是双精度类型,所以能够用最简单的赋值语句建立双精度数。

如果一个数很大,则它需要设为双精度类型,单精度是不能容纳的。例如:
>> x = 5.73 * 10 ^ 300
x = 
    5.7300e+300
X一定是一个双精度的浮点数,可以用 isfloat() 函数用来验证。

转换到双精度数

使用 double() 函数,可以把其他数值型数据、字符、字符串等转换成双精度。例如:
>> y = int64(-589324077574);
>> x = double(y)
x = 
    -5.8932e+11

单精度浮点数

MATLAB 按照 IEEE 754 标准构造单精度型数据。作为单精度存储的任何数据,都需要 32 位,其格式如下表所示。

单精度数格式
用途
31 符号,0 = 正,1 = 负
30 ~ 23 指数,偏差值为 127
22 ~ 0 数 1.f 的小数 f

单精度值依然使用 realmax() 和 realmin() 函数返回单精度能够表示的最大值和最小值,只是调用时要有参数single

建立单精度数必须使用 single() 函数建立单精度数,比如:
>> x = single(25.783);
>> whos x
    Name    Size    Bytes  Class      Attributes
    x       1x1         4  single
同样,用single函数能将其他数字、字符、字串和逻辑等类型的数转换成单精度数。

再来看一下更多创建单精度浮点数的例子:
>> a=zeros(1,5,'single')  %指定数据类型作为最后一个参数
a =
    0    0    0    0    0

>> b=eye(3,'single')  %指定数据类型作为最后一个参数
b =
    1    0    0
   0    1    0
    0    0    1

>> c=single(1:7)  %将默认双精度转换为单精度
c =
    1    2    3    4    5    6    7

>> d=cast(6:-1:0,'single')  %使用更通用的cast函数
d =
    6    5    4    3    2    1    0

单精度数据之间或单精度与双精度数据之间的数学运算结果将为单精度数,请看下面的代码(紧接上边的代码):
>> c.^d
ans =
     1    32    81    64    25     6     1

>> c*pi
ans =
    3.1416    6.2832    9.4248   12.5664   15.7080   18.8496   21.9911

>> d.*rand(size(d))
ans =
    5.0443    1.2714    3.2571    0.7306    1.8585    0.3500    0

>> class(ans)
ans =
    single

单精度数据类型中包含双精度数据类型中常见的特殊浮点值 inf 和 NaN,例如:
>> c =
     0     2     0     4     0     6     0

>> c./c
ans =
    NaN     1   NaN     1   NaN     1   NaN

>> 1./c
ans =
    Inf    0.5000    Inf    0.2500    Inf    0.1667    Inf