具有1位的Matlab定点数的行为

时间:2014-01-20 10:02:20

标签: matlab fixed-point

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

2 个答案:

答案 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)。