数值类型 #

一、数值类型概述 #

MATLAB支持多种数值类型:

类型 描述 字节数 范围
double 双精度浮点数 8 ±1.8e308
single 单精度浮点数 4 ±3.4e38
int8 8位有符号整数 1 -128 ~ 127
int16 16位有符号整数 2 -32768 ~ 32767
int32 32位有符号整数 4 -2^31 ~ 2^31-1
int64 64位有符号整数 8 -2^63 ~ 2^63-1
uint8 8位无符号整数 1 0 ~ 255
uint16 16位无符号整数 2 0 ~ 65535
uint32 32位无符号整数 4 0 ~ 2^32-1
uint64 64位无符号整数 8 0 ~ 2^64-1

二、整数类型 #

2.1 创建整数 #

matlab
% 有符号整数
a = int8(100);
b = int16(10000);
c = int32(100000);
d = int64(10000000000);

% 无符号整数
e = uint8(200);
f = uint16(50000);
g = uint32(3000000000);
h = uint64(10000000000000000000);

% 类型转换
x = 3.7;
int8(x)    % 结果: 3(截断)
int16(x)   % 结果: 3

2.2 整数范围 #

matlab
% 查看整数范围
intmax('int8')    % 127
intmin('int8')    % -128

intmax('uint8')   % 255
intmin('uint8')   % 0

% 饱和运算(不会溢出)
x = int8(120);
y = int8(20);
z = x + y         % 结果: 127(饱和到最大值)

x = int8(-120);
y = int8(-20);
z = x + y         % 结果: -128(饱和到最小值)

2.3 整数运算 #

matlab
% 整数运算
a = int16(100);
b = int16(50);

a + b     % 150
a - b     % 50
a * b     % 5000
a / b     % 2
mod(a, b) % 0

% 混合运算(结果为整数)
a = int16(100);
b = 3.5;
a * b     % 350(int16)

% 不同整数类型运算
a = int16(100);
b = int32(200);
% c = a + b;  % 错误:不能直接运算

% 需要先统一类型
c = int32(a) + b;

三、浮点数类型 #

3.1 双精度浮点数(double) #

matlab
% 默认类型
x = 3.14;
class(x)    % 'double'

% 科学计数法
a = 1.5e-10;     % 1.5 × 10^-10
b = 2.5E8;       % 2.5 × 10^8

% 十六进制表示
c = 0x1.Fp+10;   % 十六进制浮点数

% 特殊值
inf_val = 1/0;        % Inf
neg_inf = -1/0;       % -Inf
nan_val = 0/0;        % NaN

3.2 单精度浮点数(single) #

matlab
% 创建单精度
x = single(3.14);
class(x)    % 'single'

% 内存占用更小
a = zeros(1000, 1000, 'double');    % 8 MB
b = zeros(1000, 1000, 'single');    % 4 MB

% 精度较低
format long
pi_double = pi               % 3.141592653589793
pi_single = single(pi)       % 3.1415927

% 单精度运算
a = single(1.5);
b = single(2.5);
c = a + b;                   % single类型

3.3 浮点数精度 #

matlab
% 机器精度
eps      % 2.2204e-16(double)
eps('single')  % 1.1921e-07

% 精度问题
0.1 + 0.2 == 0.3    % false!

% 原因
format long
0.1 + 0.2           % 0.300000000000000
0.3                 % 0.299999999999999

% 正确的比较方法
abs(0.1 + 0.2 - 0.3) < eps    % true

% 使用容差比较
function result = approxEqual(a, b, tol)
    if nargin < 3
        tol = 1e-10;
    end
    result = abs(a - b) < tol;
end

3.4 浮点数范围 #

matlab
% 双精度范围
realmax        % 1.7977e+308
realmin        % 2.2251e-308

% 单精度范围
realmax('single')   % 3.4028e+38
realmin('single')   % 1.1755e-38

% 超出范围
realmax * 2    % Inf
-realmax * 2   % -Inf

四、复数 #

4.1 创建复数 #

matlab
% 直接创建
z1 = 3 + 4i;
z2 = 3 + 4j;        % i和j等价
z3 = 3 + 4*1i;      % 更安全的方式

% 使用complex函数
z4 = complex(3, 4); % 实部3,虚部4

% 从极坐标创建
r = 5;
theta = pi/4;
z5 = r * exp(1i * theta);

4.2 复数属性 #

matlab
z = 3 + 4i;

% 实部和虚部
real(z)      % 3
imag(z)      % 4

% 模和辐角
abs(z)       % 5
angle(z)     % 0.9273(弧度)

% 共轭复数
conj(z)      % 3 - 4i

% 复数信息
isreal(z)    % false
iscomplex(z) % true

4.3 复数运算 #

matlab
z1 = 3 + 4i;
z2 = 1 + 2i;

% 四则运算
z1 + z2      % 4 + 6i
z1 - z2      % 2 + 2i
z1 * z2      % -5 + 10i
z1 / z2      % 2.2 - 0.4i

% 幂运算
z1^2         % -7 + 24i
sqrt(z1)     % 2 + 1i

% 指数和对数
exp(z1)      % e^(3+4i)
log(z1)      % ln(3+4i)

% 三角函数
sin(z1)
cos(z1)

4.4 复数数组 #

matlab
% 创建复数数组
A = [1+2i, 3+4i; 5+6i, 7+8i];

% 提取实部和虚部
real(A)
imag(A)

% 共轭转置
A'           % 共轭转置
A.'          % 非共轭转置

五、特殊数值 #

5.1 无穷大(Inf) #

matlab
% 产生无穷大
1/0          % Inf
1e308 * 2    % Inf
exp(1000)    % Inf

% 无穷大运算
Inf + Inf    % Inf
Inf - Inf    % NaN
Inf * 0      % NaN
Inf / Inf    % NaN

% 检查无穷大
isinf(1/0)   % true
isinf([1, Inf, -Inf])  % [false, true, true]

5.2 非数字(NaN) #

matlab
% 产生NaN
0/0          % NaN
Inf - Inf    % NaN
0 * Inf      % NaN

% NaN特性
NaN == NaN   % false
NaN ~= NaN   % true

% 检查NaN
isnan(0/0)   % true
isnan([1, NaN, 3])  % [false, true, false]

% NaN在运算中传播
sum([1, NaN, 3])    % NaN
mean([1, NaN, 3])   % NaN

% 忽略NaN的函数
nansum([1, NaN, 3])    % 4
nanmean([1, NaN, 3])   % 2
nanmax([1, NaN, 3])    % 3

六、类型转换 #

6.1 显式转换 #

matlab
% 整数转换
x = 3.7;
int8(x)      % 3(截断)
int16(x)     % 3
int32(x)     % 3
int64(x)     % 3

% 四舍五入后转换
int32(round(x))    % 4

% 浮点数转换
y = 100;
single(y)    % 单精度
double(y)    % 双精度

% 复数转换
z = 3 + 4i;
double(z)    % 保持复数类型

6.2 取整函数 #

matlab
x = 3.7;
y = -3.7;

% 向零取整
fix(x)       % 3
fix(y)       % -3

% 向下取整
floor(x)     % 3
floor(y)     % -4

% 向上取整
ceil(x)      % 4
ceil(y)      % -3

% 四舍五入
round(x)     % 4
round(y)     % -4

% 指定小数位数
round(pi, 2)       % 3.14
round(pi, 4)       % 3.1416

6.3 类型判断 #

matlab
x = 42;
y = 3.14;
z = 3 + 4i;

% 判断函数
isinteger(x)       % false(double类型)
isinteger(int32(x)) % true
isfloat(y)         % true
isreal(z)          % false
isnumeric(x)       % true

% 获取类型
class(x)           % 'double'
class(int32(x))    % 'int32'

七、数值显示格式 #

7.1 format命令 #

matlab
% 默认格式
format          % 短格式

% 常用格式
format short    % 4位小数:3.1416
format long     % 15位小数:3.141592653589793
format shortE   % 科学计数法:3.1416e+00
format longE    % 科学计数法(长):3.141592653589793e+00
format bank     % 2位小数:3.14
format hex      % 十六进制:400921fb54442d18
format rat      % 有理数:355/113

% 示例
pi
% short:  3.1416
% long:   3.141592653589793
% shortE: 3.1416e+00
% rat:    355/113

7.2 显示设置 #

matlab
% 紧凑显示
format compact

% 宽松显示
format loose

% 显示分隔线
format loose
x = [1 2 3]

% 输出:
x =
     1     2     3

format compact
x = [1 2 3]

% 输出:
x = 1 2 3

八、数值运算 #

8.1 基本运算 #

matlab
% 算术运算
a = 10;
b = 3;

a + b      % 加法:13
a - b      % 减法:7
a * b      % 乘法:30
a / b      % 除法:3.3333
a \ b      % 左除:0.3
a ^ b      % 幂:1000
mod(a, b)  % 取余:1
rem(a, b)  % 取余:1

% mod vs rem
mod(-7, 3)   % 2(结果与除数同号)
rem(-7, 3)   % -1(结果与被除数同号)

8.2 数学函数 #

matlab
% 三角函数(弧度)
sin(pi/2)      % 1
cos(0)         % 1
tan(pi/4)      % 1
asin(1)        % 1.5708
acos(0)        % 1.5708
atan(1)        % 0.7854

% 角度转换
deg2rad(180)   % 3.1416
rad2deg(pi)    % 180

% 指数和对数
exp(1)         % 2.7183
log(10)        % 2.3026(自然对数)
log10(100)     % 2(常用对数)
log2(8)        % 3
sqrt(16)       % 4
power(2, 10)   % 1024

% 绝对值和符号
abs(-5)        % 5
sign(-5)       % -1
sign(0)        % 0
sign(5)        % 1

九、最佳实践 #

9.1 选择合适的类型 #

matlab
% 默认使用double
x = 3.14;

% 大数组且精度要求不高时使用single
largeArray = zeros(10000, 10000, 'single');

% 整数数据使用整数类型
imageData = imread('image.jpg');  % uint8
indices = int32(1:1000000);       % 节省内存

% 避免不必要的类型转换
% 不推荐
for i = 1:1000000
    x(i) = double(i);
end

% 推荐
x = double(1:1000000);

9.2 避免精度问题 #

matlab
% 使用容差比较浮点数
function result = isEqual(a, b, tol)
    if nargin < 3
        tol = 1e-10;
    end
    result = abs(a - b) < tol;
end

% 使用相对误差
function result = isApproxEqual(a, b, relTol)
    if nargin < 3
        relTol = 1e-8;
    end
    result = abs(a - b) < relTol * max(abs(a), abs(b));
end

9.3 处理特殊值 #

matlab
% 检查并处理NaN
data = [1, NaN, 3, NaN, 5];

% 移除NaN
cleanData = data(~isnan(data));

% 替换NaN
data(isnan(data)) = 0;

% 使用忽略NaN的函数
mean(data, 'omitnan');
std(data, 'omitnan');

十、总结 #

本章学习了:

  1. 整数类型:int8/16/32/64,uint8/16/32/64
  2. 浮点数类型:double(默认)、single
  3. 复数:创建、属性、运算
  4. 特殊值:Inf、NaN
  5. 类型转换:显式转换、取整函数
  6. 显示格式:format命令
  7. 数值运算:算术运算、数学函数

下一章将学习MATLAB的字符串类型。

最后更新:2026-03-27