fi element-wise力量。^ b
不是为了给相同的输出数据类型b的所有可能的值。
一般来说,每个值的输出数据类型可以改变b。
fi element-wise权力的实现特殊情况b = = 0,并简单地分配输出的最优1位表示。^ 0 = 1。
你聪明使用fimath似乎保持输出数据类型一致的所有积极的b值。但是使用fimath输入不能影响特殊情况输出任务b = = 0。
我没意识到无论如何直接使用fi element-wise电力运营商来避免b = = 0特殊套管。
所以你将无法完全控制
y = ^ b
对于所有支持b的万博1manbetx值。
如果你愿意也有能力操作符替换为一个自定义函数,
y = some_custom_fi_power_function (a, b)
然后有可能实现一个输出数据类型为所有b的值不会改变。
如果建筑使用fimath,显而易见的解决方案是自定义函数b = = 0和调用一个陷阱。^ b为一切。
需要考虑的另一种方法是
例子
这里显示并附呈。
的例子是为了说明一些有用的概念,如采用新印象的模式。传递的例子非常温和的现场测试。但“购者自慎”,这说明例子并没有经过严格的测试过程仿真、代码生成等。
函数y = intPowerWrapLike (u, intPow yLikeDesiredType)% # codegen
% intPowerWrapLike提高输入element-wise整数次方包装
%每一步所需的类型
%
%用法:
% y = intPowerWrapLike (u, intPow yLikeDesiredType)
%的输入:
% u值提高到一个整数
%可以是任意整数或fi二进制类型
% intPow提高你的能力,必须是非负数,标量,整数的值
% yLikeDesiredType变量的类型应该投的输出
%溢出包装和地板上舍入
%默认为u如果yLikeDesiredType不提供
%
%示例1
%格式紧凑
% = int8 ([-10、2、9]);
% b = 0:3
%日元= intPowerWrapLike (a, b)
%结束
%
%例2
%格式紧凑
% = int8 ([-10、2、9]);
% yLike = int32 (0);
% b = 0:3
% y2 = intPowerWrapLike (a, b, yLike)
%结束
%
%示例3
%格式紧凑
% fp = fipref;
% fp。NumericTypeDisplay =“短”
% = fi ((-3.375, -0.125, 2.25, 4) 1、8、4);
% yLike = fi(0, 1, 12日6);
% b = 0:4
% y2 = intPowerWrapLike (a, b, yLike)
%结束
% 2020年版权MathWorks公司。
如果输入参数个数< 3
yLikeDesiredType = u;
结束
validateattributes (u, {“embedded.fi”,“数字”},{})
validateattributes (intPow, {“embedded.fi”,“数字”},{“标量”,“整数”,非负的})
validateattributes (yLikeDesiredType, {“embedded.fi”,“数字”},{})
uFi = getLeanFiEquivalent (u);
intPowFi = valInIntType (intPow);
yLikeFi = getLeanFiEquivalent (yLikeDesiredType);
%,codegen提前定义输出类型
%初始化值1将输出如果intPow = = 0
%
yFi = 1(大小(u),“喜欢”,yLikeFi);
如果intPowFi > 0
一个=投(1,“喜欢”,intPowFi);
初始化= false;
runningInputPower =投(uFi,“喜欢”,yLikeFi);
而intPowFi > 0
如果bitand (intPowFi,)
%繁殖的权力
如果初始化
yFi (:) = mulLike (yFi、runningInputPower yLikeFi);
其他的
yFi (:) = runningInputPower;
初始化= true;
结束
结束
% k除以2(转变了在每一次迭代时有点)
intPowFi = bitsrl (intPowFi, 1);
如果intPowFi ~ = 0
%平方甚至权力
runningInputPower = mulLike (runningInputPower runningInputPower yLikeFi);
结束
结束
结束
%指定所需的类型。
%,这将改变为fi类型
% MATLAB内置整数等价的
y =投(yFi,“喜欢”,yLikeDesiredType);
结束
函数uFi = getLeanFiEquivalent (u)
%
%的fi等效输入
%给输出完整的精度与精益fimath数学选项
%
coder.inline (“总是”);
uFi = castIntToFi (u);
断言(isfi (uFi));
断言(用(uFi));
断言(uFi.isscalingbinarypoint);
调频= fimath (“RoundingMethod”,“地板”,…
“OverflowAction”,“包装”);
uFi = setfimath (uFi, fm);
结束
函数y = valInIntType (u)
%
%值的整数类型,即部分长度为零
%删除未使用的部分
%附加物理分数位如果分数长度是负的
%
coder.inline (“总是”);
u2 = castIntToFi (u);
如果isfi (u2) & &用& & u2.isscalingbinarypoint (u2)
u3 = u2;
其他的
u3 = fi(32岁的u2, 0, 0);
结束
fmLean = fimath (“RoundingMethod”,“地板”,…
“OverflowAction”,“包装”);
newWordLength = u3。字+ u3.FractionLength;
newWordLength y = fi (u3, 0, 0, fmLean);
结束
函数y = mulLike (a, b, yLikeFi)
coder.inline (“总是”);
= removefimath ();
b = removefimath (b);
如果以色列伊斯雷尔(a) & & (b)
调频= fimath (…
“RoundingMethod”,“地板”,…
“OverflowAction”,“包装”,…
“ProductMode”,“SpecifyPrecision”,…
“ProductWordLength”yLikeFi.WordLength,…
“ProductFractionLength”yLikeFi.FractionLength,…
“SumMode”,“SpecifyPrecision”,…
“SumWordLength”yLikeFi.WordLength,…
“SumFractionLength”yLikeFi.FractionLength,…
“CastBeforeSum”,真正的);
y = mpy (fm, a, b);
其他的
tempFullPrecisionProduct = a * b;
y =投(tempFullPrecisionProduct,“喜欢”,yLikeFi);
结束
y = removefimath (y);
fmLean = fimath (“RoundingMethod”,“地板”,…
“OverflowAction”,“包装”);
y = setfimath (y, fmLean);
结束