中英网站建立,龙岩百度贴吧,aso优化平台,一件代发48个货源网站文章目录 一、 整数1.1 整数的最值1.2 大整数1.3 当整数值超过了uint64最大值1.4 和其它类型数值运算 二、 浮点数2.1 双精度和单精度2.2 浮点数的存储2.3 浮点数的最值2.4 浮点数的“四舍五入”2.5 浮点数的算术运算2.6 意外#xff1a;舍入误差、抵消、淹没和中间转换 三、复… 文章目录 一、 整数1.1 整数的最值1.2 大整数1.3 当整数值超过了uint64最大值1.4 和其它类型数值运算 二、 浮点数2.1 双精度和单精度2.2 浮点数的存储2.3 浮点数的最值2.4 浮点数的“四舍五入”2.5 浮点数的算术运算2.6 意外舍入误差、抵消、淹没和中间转换 三、复数四、二进制和十六进制五、其它5.1 无穷和NaN5.2 数值显示格式5.3 检查数据类型5.4 合并不同类型 也可以看matlab官方doc。 matlab 所有的数据类型都以矩阵数据的形式组织比如单变量就是1*1的矩阵。
Matlab Matrix Laboratory。 一、 整数
MATLAB® 具有四个有符号整数类和四个无符号整数类。
有符号类型使您能够处理负整数以及正整数但表示的数字范围不如无符号类型广泛因为有一个位用于指定数字的正号或负号。
无符号类型提供了更广泛的数字范围但这些数字只能为零或正数。
MATLAB 支持以 1 字节8位、2 字节、4 字节和 8 字节32位几种形式存储整数数据。
使用可容纳你的数据的最小整数类型来存储数据则可以节省程序内存和执行时间。例如不需要使用 32 位整数来存储值 100。
下面列出了八个整数类、使用每种类型可存储的值范围以及创建该类型所需的 MATLAB 转换函数。
类值的范围转换函数十进制范围有符号 8 位整数–2^7 到 2^7–1int8–128 到 127有符号 16 位整数–2^15 到 2^15–1int16–32,768 到 32,767有符号 32 位整数–2^31 到 2^31–1int32–2,147,483,648 到 2,147,483,647有符号 64 位整数–2^63 到 2^63–1int64–9,223,372,036,854,775,808 到 9,223,372,036,854,775,807无符号 8 位整数0 到 2^8–1uint80 到 255无符号 16 位整数0 到 2^16–1uint160 到 65,535无符号 32 位整数0 到 2^32–1uint320 到 4,294,967,295无符号 64 位整数0 到 2^64–1uint640 到 18,446,744,073,709,551,615
MATLAB 默认情况下以双精度浮点形式 (double) 存储数值数据。
下面的 f 看似赋值为整数实则自带存储为一个浮点数。 1.1 整数的最值
intmax(int8)
intmin(int8)输出
ans 127
ans -128 如果您将大于某个整数数据类型的最大值的数值转换为该类型MATLAB 会将其设置为最大值。同样如果您转换小于该整数数据类型的最小值的数值MATLAB 会将其设置为最小值。
如
y int8(200)
x int8(100)*3的值都是127。
1.2 大整数
大于flintmax 9.0072e15的整数 flintmaxans 9.0072e15这个值还没有int64的最大值大9.2234e18更没有uint64最大值大1.8447e19。
当创建由大整数大于 flintmax的数值组成的数组时默认情况下MATLAB 最初将输入表示为双精度值。当你将此输入转换为 int64 或 uint64 数据类型时可能出现精度损失。为了保持精度请改为对数组的每个标量元素调用 int64 或 uint64。
比如
flintmaxX int64([-12345678901234567 12345678901234567])Y [int64(-12345678901234567) int64(12345678901234567)]从 R2019b 开始还可以使用整数的十六进制或二进制值创建整数数组而不会损失精度注意十六进制的后缀加了s64表示有符号64位整数后面会讲。
Z [0xFFD423ABA294B479s64 0x2BDC545D6B4B87s64]1.3 当整数值超过了uint64最大值
uint64可以表示的最大整数是18446744073709551615约为 1.8 ∗ 1 0 19 1.8*10^{19} 1.8∗1019
大于这个值只能转换为浮点数吗
转换为double类型虽然可以表达的最大值变大了非常多但是精度会丢失小数位数有限当然这么大的整数可能只在乎数量级了。这里仅作理论讨论。
几种处理方式
1使用字符串或者字符数组2使用第三方高精度数学库3将其分隔为多个部分再使用uint8等存储4使用符号计算Symbolic Math Toolbox5使用十六进制或者二进制。
字符串和十六进制应该是最容易想到的不过我们几乎不会遇到处理这种整数的情况。
1.4 和其它类型数值运算
整数只能和同类型的整数进行运算int8和int16这样无法进行运算。 int类型数据与其他类型数据运算后结果与 int 类型一致且受对应的int类型大小范围限制。
x int16(100)*double(3)y double(3)*int8(100)z int8(1)*a输出
x 300
y 127
z 97即不会将结果转为更高精度的浮点数。 二、 浮点数
2.1 双精度和单精度 “浮点”指一组对实数进行编码的数据类型包括分数和小数。浮点数据类型允许小数点后有不同位数而定点数据类型在小数点前后则保留特定位数。因此与定点数据类型相比浮点数据类型可以表示更广范围的数值。 由于计算机在数字表示和存储方面的内存有限只能表示有限精度的浮点数有限集合。这种有限精度无法精确表示某些数值因而会限制需要精确值或高精度的浮点计算的准确度。尽管浮点数有其局限性但其计算速度快且精度和范围足以求解现实世界的很多问题因此得到广泛使用。 MATLAB® 以双精度或单精度格式表示浮点数。
默认为双精度但你可以通过一个简单的转换函数将任何数值转换为单精度数值。
1创建双精度数据 由于 MATLAB 的默认数值类型是 double 类型因此可以用简单的赋值语句创建双精度浮点数。
x 122可以使用 double 函数将数值数据、字符或字符串以及逻辑数据转换为双精度值。例如将有符号整数转换为双精度浮点数。
x int8(120);
y double(x)2创建单精度数据
使用 single 函数创建单精度数值。
x single(25.783);2.2 浮点数的存储
默认情况下MATLAB 根据 IEEE754 格式构造其 double 和 single 浮点数据类型并遵循就近舍入偶数优先舍入模式。
数据以二进制形式存储于计算机。
浮点数 x x x的二进制存储形式如下 x − 1 s ⋅ ( 1 f ) ⋅ 2 e x-1^s\cdot(1f)\cdot2^e x−1s⋅(1f)⋅2e
其中
s 确定符号。f 是满足 0 ≤f 1 的小数或尾数。e 是指数。
s、f 和 e 分别由内存中有限数量的位确定其中 f 和 e 取决于数据类型的精度。 存储 double 数需要 64 位如下表所示。
位宽度用法631存储符号其中 0 表示正值1 表示负值s62 到 5211存储指数偏移量为 1023 e51 到 052存储尾数 f
存储 single 数需要 32 位如下表所示。
位宽度用法311存储符号其中 0 表示正值1 表示负值30 到 238存储指数偏移量为 12722 到 023存储尾数 浮点数能表示的最大数量级
用11个二进制位表示指数则指数最大值为 2 11 − 1 2047 2^{11}-12047 211−12047 偏移量是1023则最大指数为2047 - 1023 1024对应的数量级就是 2 1024 2^{1024} 21024 1 0 308 10^{308} 10308负数则是 1 0 − 308 10^{-308} 10−308
浮点数能保存的十进制的最多有效位数
以双精度为例52位二进制表示尾数一个2进制能表示的十进制数的位数是 l o g 10 2 log_{10}2 log102。二进制形式存储尾数时候最高位默认位153个二进制位能表示的十进制数的位数是 53 ∗ l o g 10 2 ≈ 15.96 53*log_{10}2 \approx15.96 53∗log102≈15.96
所以double类型存储数据的有效位数是15到16位如果是一个整数则是最大为2^53即flinrmax。
同理single最多可以精确存储6到7位有效数字。
超过有效位数的时候超过的部分就可能丢失精度。 即double使用64个二进制位存储十进制数这64个二进制位只有52个二进制位来存储尾数对应十进制的15到16位有效数字。 浮点数的大小比较问题
主要是小数部分小数转为二进制有时候是无限循环的但是一个double最多使用52位来存储小数部分对应的二进制有限的二进制位就不能精确表示这个小数只是无限精确。即使精确到99.99999999999%也不是等于。
比如 0.10.2 和 0.3 是不相等的。因为0.1和0.2对应的52位尾数二进制相加后和0.3的二进制不同 转换 0.1 为二进制 0.1 * 2 0.2 → 整数部分是 0记录下来剩余部分是 0.2。0.2 * 2 0.4 → 整数部分是 0记录下来剩余部分是 0.4。0.4 * 2 0.8 → 整数部分是 0记录下来剩余部分是 0.8。0.8 * 2 1.6 → 整数部分是 1记录下来剩余部分是 0.6。0.6 * 2 1.2 → 整数部分是 1记录下来剩余部分是 0.2。0.2 * 2 0.4 → 整数部分是 0记录下来剩余部分是 0.4。 可以看到0.1 的小数部分开始循环重复0.1 0.00011001100110011...这是一个无限循环的二进制小数。 浮点数运算后可以使用如下方式比较2个运算结果
xy-0.3epseps表示浮点相对精度即2个距离最近的双精度浮点数之间的距离。d eps(single)则为2个距离最近的single之间的距离。 epsans 2.2204e-162.3 浮点数的最值
double_max realmax(double)
double_min realmin(double)single_max realmax(single)
single_min realmin(single)double_max 1.7977e308表示 1.797 ∗ 1 0 308 1.797*10^{308} 1.797∗10308。这个数是极大的是太阳质量的数量级的10多倍。
超过这个范围的数记为Inf-Inf。
2.4 浮点数的“四舍五入”
❄️ 1直接使用int8等转换函数转换为整数类型规则是小数部分四舍五入
❄️ 2round函数支持多种转换方案 a. 小数部分四舍五入结果为double类型round(x) b. 四舍五入到 N 位数N可用为正负、零从小数点向两边数起Y round(X,N) c. 指定四舍五入类型Y round(X,N,type) type的取值有decimals 默认 | significant前者指定保留的小数位数等同于Y round(X,N) 若使用第二个参数四舍五入到具有 N 个有效位数的最近数值
num 1234.456
num_round_2 round(num,2,significant)
num_round_3 round(num,3,significant)输出分别是1200和1230。
d.指定处理方向结值处理方向指定为以下值之一
Y round(___,TieBreakerdirection)“fromzero” - 将结值朝偏离零的方向舍入到模更大的最接近的整数。 “tozero” - 将结值朝零方向舍入到模更小的最接近的整数。 “even” - 将结值舍入到最接近的偶数。 “odd” - 将结值舍入到最接近的奇数。 “plusinf” - 将结值朝正无穷大方向舍入到更大的最接近的整数。 “minusinf” - 将结值朝负无穷大方向舍入到更小的最接近的整数。 例
num 1.5
num_round_1 round(num,TieBreaker,fromzero) % 输出是2
num_round_2 round(num,TieBreaker,tozero) % 输出是1上面2个参数主要是针对小数等于0.5的情况。而num 1.2结果均为1num1.7结果均为2。
推荐使用round进行正常四舍五入带方向的可以使用下列函数
❄️ 3floor(X)函数将 X 的每个元素四舍五入到小于或等于该元素的最接近整数。 ❄️ 4ceil(X)函数将 X 的每个元素四舍五入到大于或等于该元素的最接近整数。 ❄️ 5fix(X) 函数将 X 的每个元素朝零方向四舍五入为最近的整数。此操作实际上是通过删除 X 中每个数的小数部分将它们截断为整数 2.5 浮点数的算术运算
就几条规则
double类型可用和任意类型进行运算。常见single、double、char、logic、任意int类型 和single运算的结果是single和整数运算结果为对应的整数类型且结果受到对应整数类型的最值限制其它结果都为double类型。 single类型只能和以下类型运算single、double、char、logic即不能和整数运算。结果都为single。
2.6 意外舍入误差、抵消、淹没和中间转换
之前已经说过了浮点数可能需要无限个二进制位来精确存储但这不现实实际上只能用64位来存储一个浮点数所以会导致一些不准确或者意料之外的结果。 意外的结果并非 MATLAB 中的 Bug任何使用浮点数的软件都会出现这种情况。如果需要数值的精确有理表示形式请考虑使用 Symbolic Math Toolbox™。 1舍入误差
浮点数的有限精度表示可能导致舍入误差。例如 π \pi π。 sin(pi)ans 1.2246e-16当对浮点数执行许多运算时误差会不断累积和复合舍入误差最为显著。最佳做法是尽可能减少运算次数。
2抵消根据 eps 的测量从数量级大致相同的一个数中减去另一个数时可能发生抵消。
3淹没对数量级相差特别大的浮点数执行运算时可能发生淹没。
3中间转换使用不同数据类型执行算术时中间计算和转换可能会产生意外的结果。 三、复数
复数由两个单独的部分组成实部和虚部。
基本虚数单位等于 -1 的平方根。这在 MATLAB® 中通过以下两个字母之一表示i 或 j。
直接创建
x 2 3i;使用complex函数创建z complex(a,b) 通过两个实数输入创建一个复数输出 zz a bi。
获取实部real(z)获取虚部imag(z)
实部和虚部的要求
同为一种类型的整数同为浮点数doublesingle混用结果实部和虚部都为single 数乘复数要求一样的数要和复数的实部和虚部类型一致实部和虚部都会同时进行相同的运算。 四、二进制和十六进制
在 MATLAB® 中有两种方式来表示十六进制和二进制值 作为字面值。从 R2019b 开始您可以使用适当的前缀作为表示法将十六进制和二进制值写成字面值。例如字面值 0x2A 指定 42MATLAB 会将其存储为数字而不是文本。 作为字符串或字符向量。例如字符向量 ‘2A’ 将数字 42 表示为十六进制值。当您使用文本表示十六进制或二进制值时请用引号将它括起来。MATLAB 将这种表示存储为文本而不是数字。
MATLAB 中的一些函数可用于将数字与其十六进制及二进制表示相互转换。
五、其它
5.1 无穷和NaN
5.2 数值显示格式
5.3 检查数据类型
5.4 合并不同类型