我注意到 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/

10-16 22:02