MATLAB数值与精度关系到整数溢出、浮点误差和类型转换。程序能跑起来,不等于结果一定对,数字类型上的细节经常是隐性错误的来源。

默认类型:double

x = 3 时,得到的其实是 double,8 字节双精度浮点。也就是说,看起来像整数,默认仍按浮点存放。

数值类型占内存多少(越长越占空间) double 8 字节(默认) single 4 字节 int8 1 字节 uint8 1 字节 int32 4 字节
MATLAB 默认全是 double(8 字节),single 和 int32 各 4 字节,int8/uint8 只要 1 字节,想省内存或对接二进制数据时才主动转换。
x = 3;
class(x)   % 'double'

只有在想省内存,或要对接外部二进制数据时,才需要转成真正的整数类型。

常用数值类型

类型含义
double双精度浮点(默认)
single单精度浮点,内存减半
int8/16/32/64有符号整数
uint8/16/32/64无符号整数

用对应函数转换。转成整数时会四舍五入:

int8(5.7)          % 6
int32([5.32 3.47 6.28]) .* 7.5   % 38 23 45(先转整数再乘)

整数范围:intmax / intmin

intmin('int8')   % -128
intmax('int8')   % 127
intmax('uint8')  % 255
intmax('int32')  % 2147483647

超出范围会饱和到边界,而不是报错,这是常见的隐性错误来源:

uint8(300)   % 255(被截到最大值)

浮点范围:realmax / realmin

realmax('double')   % 1.7977e+308
realmin('double')   % 2.2251e-308

浮点精度:为什么 0.1+0.2 不等于 0.3

二进制无法精确表示 0.1,所以浮点比较要带容差:

0.1 + 0.2 == 0.3          % 0(false)
abs((0.1+0.2) - 0.3) < 1e-9  % 1(用容差比较)

比较浮点数用 abs(a-b) < tol,不要直接用 ==

判断与读取类型

class(x)          % 类型名
isfloat(x)        % 是否浮点
isinteger(x)      % 是否整数类型
isa(x, 'double')  % 是否某类型

自查清单

  • 为什么 3 在 MATLAB 里是 double 而不是 int?
  • uint8(300) 会报错还是返回 255?
  • 比较两个浮点数是否相等,正确做法是什么?
  • intmax('uint16') 是多少?
  • 什么时候该主动用 single 或 uint8?