我注意到 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
最佳答案
当 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
关于matlab - 具有 1 位的 Matlab 定点数的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21230989/