Skip to content

MATLAB - 数字

MATLAB 专为数值计算而设计,支持丰富的数值数据类型。其中包括各种大小的有符号和无符号整数,以及单精度和双精度浮点数。默认情况下,MATLAB 将所有数值存储为 double 类型,这是一种 64 位双精度浮点类型。

虽然 double 适用于大多数科学和工程计算,但对于特定任务,使用其他类型可能至关重要,例如节省内存、执行整数运算或与需要特定数据格式的硬件进行接口。

MATLAB 提供函数将变量显式转换为特定的数值类型。当从浮点数转换为整数时,MATLAB 会将值四舍五入到最近的整数。

函数目的
double转换为 64 位双精度浮点数
single转换为 32 位单精度浮点数
int8转换为 8 位有符号整数
int16转换为 16 位有符号整数
int32转换为 32 位有符号整数
int64转换为 64 位有符号整数
uint8转换为 8 位无符号整数
uint16转换为 16 位无符号整数
uint32转换为 32 位无符号整数
uint64转换为 64 位无符号整数

创建一个脚本,看看转换如何影响计算。请注意,当浮点数结果转换为整数时,会进行四舍五入。

% 从默认的双精度数组开始
original_data = [2.71, -3.14, 8.99];
% 执行计算,结果也是双精度
result_double = original_data * 10.5
class(result_double)
% 转换为单精度(更少内存,更低精度)
result_single = single(result_double)
class(result_single)
% 转换为 16 位整数(值将四舍五入)
result_int16 = int16(result_double)
class(result_int16)

运行文件时,输出将是:

result_double =
28.4550 -32.9700 94.3950
ans =
'double'
result_single =
single
28.4550 -32.9700 94.3950
ans =
'single'
result_int16 =
int16
28 -33 94
ans =
'int16'

每种数值类型只能表示有限范围的值。intmin、intmax、realmin 和 realmax 函数用于查找这些限制。

以下脚本演示了如何显示各种整数类型的范围。

% 显示有符号整数的范围
fprintf('Range for int8: %d to %d\n', intmin('int8'), intmax('int8'));
fprintf('Range for int16: %d to %d\n', intmin('int16'), intmax('int16'));
fprintf('Range for int32: %d to %d\n', intmin('int32'), intmax('int32'));
% 对于 64 位整数,使用 num2str,因为 %d 格式说明符可能不支持它们
min_i64 = num2str(intmin('int64'));
max_i64 = num2str(intmax('int64'));
fprintf('Range for int64: %s to %s\n', min_i64, max_i64);
% 显示无符号整数的范围
fprintf('\nRange for uint8: %u to %u\n', intmin('uint8'), intmax('uint8'));
fprintf('Range for uint16: %u to %u\n', intmin('uint16'), intmax('uint16'));
fprintf('Range for uint32: %u to %u\n', intmin('uint32'), intmax('uint32'));
min_u64 = num2str(intmin('uint64'));
max_u64 = num2str(intmax('uint64'));
fprintf('Range for uint64: %s to %s\n', min_u64, max_u64);

运行文件时,它会产生正确的范围:

Range for int8: -128 to 127
Range for int16: -32768 to 32767
Range for int32: -2147483648 to 2147483647
Range for int64: -9223372036854775808 to 9223372036854775807
Range for uint8: 0 to 255
Range for uint16: 0 to 65535
Range for uint32: 0 to 4294967295
Range for uint64: 0 to 18446744073709551615

类似地,realmin 和 realmax 显示最小正浮点数和最大有限浮点数。

% 显示单精度浮点数的范围
fprintf('Single precision positive range: %g to %g\n', ...
realmin('single'), realmax('single'));
% 显示双精度浮点数的范围
fprintf('Double precision positive range: %g to %g\n', ...
realmin('double'), realmax('double'));

这将显示以下结果:

Single precision positive range: 1.17549e-38 to 3.40282e+38
Double precision positive range: 2.22507e-308 to 1.79769e+308
  • 坚持使用 double 类型:除非有充分理由,否则所有通用计算都使用默认的 double 类型。
  • 整数数据使用整数类型:如果您处理的数据本质上是整数(如计数、索引或 0-255 的像素值),请使用适当的整数类型(例如图像使用 uint8)。这可以节省内存并防止细微的浮点错误。
  • 注意溢出:对整数进行算术运算时,请注意,超出类型范围的结果将“饱和”到最小值或最大值。例如,int8(120) + int8(10) 的结果是 127。
  • single 用于内存优化:对于内存受限且降低精度可接受的非常大的数组,请使用 single 精度。