我注意到Matlab-FI数字很有趣。它只发生在1位有符号数字(实际上没有多大意义的数据类型)。 我知道将double乘以fi并不是一个好习惯,行为甚至可能依赖于Matlab版本,但我希望行为与位数无关。这似乎在2011b,2013a和2013b版本中是一致的,我想理解为什么会这样。
示例1: -1可以表示为1位,有符号。然而,结果具有-2的小数部分,其仅允许数字[-8,-4,0,4]
>> a = fi(-1,1,1,0)
a = -1
s1,0
>> 1*a
ans = 0
s2,-2
示例2: 1位无符号的行为符合预期,小数部分未更改
>> b = fi(1,0,1,0)
b = 1
u1,0
>> 1*b
ans = 1
u2,0
示例3: 2位,带符号的行为符合预期,小数部分未更改,整数部分已扩展
>> c = fi(-2,1,2,0)
c = -2
s2,0
>> 1*c
ans = -2
s4,0
示例4:另一个1位,已签名,显示与示例1中类似的行为。
>> d = fi(-0.5,1,1,1)
d = -0.5000
s1,1
>> 1*d
ans = 0
s2,-1
答案 0 :(得分:3)
当matlab将数字与不同格式相乘时,它首先改变了修改格式的方法。如果您将1
格式转换为与您的值相同的格式,则有时此格式中的第一个格式为0
,因此有意义的是产品为零,并且一切都符合预期。
示例1
a = fi(-1,1,1,0); a_one = fi(1,1,1,0); disp([a, a_one, a*a_one])
-1 0 0
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 1
FractionLength: 0
示例2
b = fi(1,0,1,0); b_one = fi(1,0,1,0); disp([b, b_one, b*b_one])
1 1 1
DataTypeMode: Fixed-point: binary point scaling
Signedness: Unsigned
WordLength: 1
FractionLength: 0
示例3
c = fi(-2,1,2,0); c_one = fi(1,1,2,0); disp([c, c_one, c*c_one])
-2 1 -2
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 2
FractionLength: 0
示例4
d = fi(-0.5,1,1,1); d_one = fi(1,1,1,1); disp([d, d_one, d*d_one])
-0.500000000000000 0 0
DataTypeMode: Fixed-point: binary point scaling
Signedness: Signed
WordLength: 1
FractionLength: 1
答案 1 :(得分:1)
免责声明:以下是MathWorks支持的(稍加编辑)答案,我为了完整性而添加了该答案。简而言之,事实证明这不仅限于1位数据类型,而是(如sebas所指出的)将双常量强制转换为另一个操作数并在那里饱和,特别是没有警告,但根据规范。
事实证明,使用另一个操作数的符号和字长,在数学运算之前(例如1
)将双常数值(例如,*
)强制转换为FI类型。但是,新FI类型使用“最佳精度”分数长度而不是另一个操作数的分数长度。
以下是一些具有显式fi()
构造函数的等效MATLAB代码,说明了这一点:
示例1。
>> a = fi(-1,1,1,0)
a =
-1
s1,0
>> fi(1,a.SignednessBool,a.WordLength) * a
ans =
0
s2,-2
>> 1*a
ans =
0
s2,-2
示例2。
>> b = fi(1,0,1,0)
b =
1
u1,0
>> fi(1,b.SignednessBool,b.WordLength) * b
ans =
1
u2,0
>> 1 * b
ans =
1
u2,0
示例3。
>> c = fi(-2,1,2,0)
c =
-2
s2,0
>> fi(1,c.SignednessBool,c.WordLength) * c
ans =
-2
s4,0
>> 1 * c
ans =
-2
s4,0
示例4。
>> d = fi(-0.5,1,1,1)
d =
-0.5000
s1,1
>> fi(1,d.SignednessBool,d.WordLength) * d
ans =
0
s2,-1
>> 1*d
ans =
0
s2,-1
我希望这些示例有助于澄清双常量值的隐式类型转换(例如1
)。