MATLAB数值与精度关系到整数溢出、浮点误差和类型转换。程序能跑起来,不等于结果一定对,数字类型上的细节经常是隐性错误的来源。
默认类型:double
写 x = 3 时,得到的其实是 double,8 字节双精度浮点。也就是说,看起来像整数,默认仍按浮点存放。
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?