定点的权力0单词长度变化

2视图(30天)
我想实现相当于C数据类型,例如, int32_t MATLAB。据我所知(建议欢迎!),正确的方法是定义我自己的 my_int32 像这样:
函数y = my_int32 (x)
% MY_UINT16总结的这个函数
%的详细解释
持续的T32 F32
T32 = numerictype (“Signedness”,“签署”,
“字”32岁的
“FractionLength”,0);
F32 = fimath (“RoundingMethod”,“零”,
“OverflowAction”,“包装”,
“ProductMode”,“KeepLSB”,
“ProductWordLength”32岁的
“ProductFractionLength”0,
“SumMode”,“KeepLSB”,
“SumWordLength”32岁的
“SumFractionLength”0,
“CastBeforeSum”,真正的);
y = fi (x, T32 F32);
结束
MATLAB的版本 int32 不会为我工作,因为他们没有封边溢出像c .现在我得到一些奇怪的行为2 ^ 0:
> > my_int32 (2) ^ 1
ans =
2
DataTypeMode:定点:二进制扩展
Signedness:签署
字:32
FractionLength: 0
RoundingMethod:零
OverflowAction:包装
ProductMode: KeepLSB
ProductWordLength: 32
SumMode: KeepLSB
SumWordLength: 32
CastBeforeSum:真
> > my_int32 (2) ^ 0
ans =
1
DataTypeMode:定点:二进制扩展
Signedness:无符号
字:1
FractionLength: 0
RoundingMethod:零
OverflowAction:包装
ProductMode: KeepLSB
ProductWordLength: 32
SumMode: KeepLSB
SumWordLength: 32
CastBeforeSum:真
出于某种原因,这个词的长度 my_int32 (2) ^ 0 不是32,但1。我试着像 my_int32 (2) ^ my_int32 (0) 都无济于事。这是为什么和如何我可以修复它吗?

答案(1)

MathWorks定点团队
MathWorks定点团队 2020年8月31日
编辑:MathWorks定点团队 2020年8月31日
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);
结束

标签

s manbetx 845


释放

R2020a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!