MATLAB - 数字
MATLAB - 数值类型
Section titled “MATLAB - 数值类型”MATLAB 专为数值计算而设计,支持丰富的数值数据类型。其中包括各种大小的有符号和无符号整数,以及单精度和双精度浮点数。默认情况下,MATLAB 将所有数值存储为 double 类型,这是一种 64 位双精度浮点类型。
虽然 double 适用于大多数科学和工程计算,但对于特定任务,使用其他类型可能至关重要,例如节省内存、执行整数运算或与需要特定数据格式的硬件进行接口。
数值数据类型转换
Section titled “数值数据类型转换”MATLAB 提供函数将变量显式转换为特定的数值类型。当从浮点数转换为整数时,MATLAB 会将值四舍五入到最近的整数。
| 函数 | 目的 |
|---|---|
| double | 转换为 64 位双精度浮点数 |
| single | 转换为 32 位单精度浮点数 |
| int8 | 转换为 8 位有符号整数 |
| int16 | 转换为 16 位有符号整数 |
| int32 | 转换为 32 位有符号整数 |
| int64 | 转换为 64 位有符号整数 |
| uint8 | 转换为 8 位无符号整数 |
| uint16 | 转换为 16 位无符号整数 |
| uint32 | 转换为 32 位无符号整数 |
| uint64 | 转换为 64 位无符号整数 |
示例:类型转换及其影响
Section titled “示例:类型转换及其影响”创建一个脚本,看看转换如何影响计算。请注意,当浮点数结果转换为整数时,会进行四舍五入。
% 从默认的双精度数组开始original_data = [2.71, -3.14, 8.99];
% 执行计算,结果也是双精度result_double = original_data * 10.5class(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.3950ans = 'double'
result_single = single
28.4550 -32.9700 94.3950ans = 'single'
result_int16 = int16
28 -33 94ans = 'int16'数值类型范围
Section titled “数值类型范围”每种数值类型只能表示有限范围的值。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 127Range for int16: -32768 to 32767Range for int32: -2147483648 to 2147483647Range for int64: -9223372036854775808 to 9223372036854775807
Range for uint8: 0 to 255Range for uint16: 0 to 65535Range for uint32: 0 to 4294967295Range 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+38Double precision positive range: 2.22507e-308 to 1.79769e+308- 坚持使用
double类型:除非有充分理由,否则所有通用计算都使用默认的double类型。 - 整数数据使用整数类型:如果您处理的数据本质上是整数(如计数、索引或 0-255 的像素值),请使用适当的整数类型(例如图像使用
uint8)。这可以节省内存并防止细微的浮点错误。 - 注意溢出:对整数进行算术运算时,请注意,超出类型范围的结果将“饱和”到最小值或最大值。例如,
int8(120) + int8(10)的结果是127。 single用于内存优化:对于内存受限且降低精度可接受的非常大的数组,请使用single精度。