MATLAB double和single类型的用法(附带实例)
MATLAB 提供了单精度浮点数类型和双精度浮点数类型,它们在存储位宽、各数据位的用途、表示的数值范围、转换函数等方面有所不同,如下表所示。
从表中可以看出,单精度浮点数类型存储所用的位数少,因此占用内存小,但从各数据位的用途来看,单精度浮点数能够表示的数值范围和数值精度都比双精度浮点数小。
创建浮点数类型也可以通过转换函数来实现,MATLAB 中默认的数值类型是双精度浮点数类型。
【实例】浮点数类型转换函数的应用。在命令行窗口中输入以下语句,并查看输出结果。
单精度浮点数与逻辑型、字符型数据及其他类型浮点数进行运算时,返回结果都为单精度浮点数类型。
注意,单精度浮点数不能和整数类型数据进行算术运算。
【实例】浮点数参与的运算。在命令行窗口中输入以下语句,并查看输出结果。
任何两个接近的浮点数之间都有一个很微小的间隙(或间隔),而所有处在这个间隙中的值都只能用这两个浮点数中的一个来表示。
MATLAB 提供了浮点相对精度 eps 函数,通过该函数可以获取一个数值和它最接近的浮点数之间的间隙大小。
浮点数类型 | 存储位宽 | 各数据位的用途 | 数值范围 | 转换函数 |
---|---|---|---|---|
双精度 | 64 位 |
0~51 位表示小数部分 52~62 位表示指数部分 63 位表示符号(0 为正,1 为负) |
−1.79769e+308~2.22507e−308 2.22507e−308~1.79769e+308 |
double |
单精度 | 32 位 |
0~22 位表示小数部分 23~30 位表示指数部分 31 位表示符号(0 为正,1 为负) |
−3.40282e+038~−1.17549e−038 −1.17549e−038~3.40282e+038 |
single |
从表中可以看出,单精度浮点数类型存储所用的位数少,因此占用内存小,但从各数据位的用途来看,单精度浮点数能够表示的数值范围和数值精度都比双精度浮点数小。
创建浮点数类型也可以通过转换函数来实现,MATLAB 中默认的数值类型是双精度浮点数类型。
【实例】浮点数类型转换函数的应用。在命令行窗口中输入以下语句,并查看输出结果。
>> x = 3.4 x = 3.4000 >> y = single(x) % 把 double 型变量强制转换为 single 型 y = single 3.4000 >> c = uint32(65758); % 定义一个 uint32 型变量 c >> cc = double(c) % 将 uint32 型变量 c 强制转换为 double 型 cc = 65758 >> whos Name Size Bytes Class Attributes c 1x1 4 uint32 cc 1x1 8 double x 1x1 8 double y 1x1 4 single在涉及双精度浮点数的运算中,返回值的类型依赖于参与运算的其他数据类型。双精度浮点数与逻辑型、字符型数据进行运算时,返回结果为双精度浮点数类型;与整数型数据进行运算时,返回结果为相应的整数类型;与单精度浮点型数据进行运算时,返回结果为单精度浮点数类型。
单精度浮点数与逻辑型、字符型数据及其他类型浮点数进行运算时,返回结果都为单精度浮点数类型。
注意,单精度浮点数不能和整数类型数据进行算术运算。
【实例】浮点数参与的运算。在命令行窗口中输入以下语句,并查看输出结果。
>> clear % 清除存储空间中的变量 >> a = uint32(282); % 定义一个 uint32 型变量 a >> y = single(53.756); % 定义一个 single 型变量 y >> z = 53.751; % 定义一个 double 型变量 z >> ay = a * y 错误使用 * 整数只能与同类的整数或双精度标量值组合使用。 >> az = a * z % 将 uint32 型变量 a 与 double 型变量 z 相乘 az = uint32 15158 >> whos Name Size Bytes Class Attributes a 1x1 4 uint32 az 1x1 4 uint32 y 1x1 4 single z 1x1 8 double从表 1 可以看出,浮点数只占用一定的存储位宽,其中只有有限位分别用来存储指数部分和小数部分。因此,浮点数类型能表示的实际数值是有限的,而且是离散的。
任何两个接近的浮点数之间都有一个很微小的间隙(或间隔),而所有处在这个间隙中的值都只能用这两个浮点数中的一个来表示。
MATLAB 提供了浮点相对精度 eps 函数,通过该函数可以获取一个数值和它最接近的浮点数之间的间隙大小。