# cast

## 语法

``b = cast(a,'like',p)``

## 说明

``b = cast(a,'like',p)` 将 `a` 转换为与 `p` 具有相同 `numerictype`、复/实性（实数或复数）以及 `fimath` 的数值。如果 `a` 和 `p` 均为实数，则 `b` 也是实数。否则，`b` 为复数。`

## 示例

`a = int8(5);`

`p = fi([],1,24,12);`

`a` 转换为定点，其 `numerictype`、复/实性（实数或复数）和 `fimath` 与指定的 `fi` 对象 `p` 相同。

`b = cast(a, 'like', p)`
```b = 5 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 24 FractionLength: 12 ```

`A = ones(2,3);`

`p = fi([],1,16,8);`

`A` 转换为与 `p` 具有相同的数据类型和复/实性（实数或复数）的数值。

`B = cast(A,'like',p)`
```B = 1 1 1 1 1 1 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 8 ```

```function [y,z] = my_filter(b,a,x,z,T) % Cast the coefficients to the coefficient type b = cast(b,'like',T.coeffs); a = cast(a,'like',T.coeffs); % Create the output using zeros with the data type y = zeros(size(x),'like',T.data); for i = 1:length(x) y(i) = b(1)*x(i) + z(1); z(1) = b(2)*x(i) + z(2) - a(2) * y(i); z(2) = b(3)*x(i) - a(3) * y(i); end end ```

```function zeros_ones_cast_example % Define coefficients for a filter with specification % [b,a] = butter(2,0.25) b = [0.097631072937818 0.195262145875635 0.097631072937818]; a = [1.000000000000000 -0.942809041582063 0.333333333333333]; % Define floating-point types T_float.coeffs = double([]); T_float.data = double([]); % Create a step input using ones with the % floating-point data type t = 0:20; x_float = ones(size(t),'like',T_float.data); % Initialize the states using zeros with the % floating-point data type z_float = zeros(1,2,'like',T_float.data); % Run the floating-point algorithm y_float = my_filter(b,a,x_float,z_float,T_float); % Define fixed-point types T_fixed.coeffs = fi([],true,8,6); T_fixed.data = fi([],true,8,6); % Create a step input using ones with the % fixed-point data type x_fixed = ones(size(t),'like',T_fixed.data); % Initialize the states using zeros with the % fixed-point data type z_fixed = zeros(1,2,'like',T_fixed.data); % Run the fixed-point algorithm y_fixed = my_filter(b,a,x_fixed,z_fixed,T_fixed); % Compare the results coder.extrinsic('clf','subplot','plot','legend') clf subplot(211) plot(t,y_float,'co-',t,y_fixed,'kx-') legend('Floating-point output','Fixed-point output') title('Step response') subplot(212) plot(t,y_float - double(y_fixed),'rs-') legend('Error') figure(gcf) end```

## 提示

• 重用具有不同数据类型的算法代码。

• 使用数据类型设定和针对不同数据类型的 switch 语句来保持算法的简洁性。

• 提高算法代码的可读性。

• 在定点和浮点数据类型之间切换以比较基线。

• 在不更改算法代码的情况下，在不同定点设置之间切换。