2

我正在尝试为 picoblaze 微控制器编写二进制 8 位浮点加法算法(1 个符号位、4 个指数位和 3 个尾数位)

我让它与正数一起工作,但当也有负数时我不知道该怎么做。

我的主要问题是设置结果的符号位,有人可以解释如何正确设置吗?

我的想法是检查两个数字的符号;然后如果它们都是正数,则将符号设置为 0,如果它们都是负数,则将符号设置为 1,并使用与之前相同的方法进行加法,如果一个是负数,一个是正数,则比较数字并使用较大的一个符号位,但我不知道如何比较这两个数字,代码变得有点混乱,有没有更好的方法呢?

4

3 回答 3

3

一般来说(忽略 NaN 之类的东西),对于A = B + C

  • ifC的量级大于B, 交换BC这样你就知道它B必须具有“更大或相等”的量级。注意:幅度忽略符号位(例如,-6 的幅度大于 +4,因为 6 > 4)。

  • ifBC有不同的符号,否定C和做subtract_internal;否则做add_internal

  • 对于subtract_internal,忽略符号位,减去幅度(不要忘记B必须具有“更大或等于”幅度),然后将符号设置为A等于B或的符号C(无论如何它们将具有相同的符号)。

  • 对于add_internal,忽略符号位,添加幅度,然后将符号设置为A等于B或的符号C(无论如何它们将具有相同的符号)。

此外,一般来说(忽略 NaN 之类的东西),对于A = B - C

  • 如果C幅度大于B,则交换BC否定它们(例如A - C == (-C) - (-A)),以便您知道它B必须具有“更大或相等”的幅度。

  • ifBC有不同的符号,否定C和做add_internal;否则做subtract_internal

于 2019-06-19T19:53:29.027 回答
3

如果将操作数转换为二进制补码,则不必关心操作数的符号。

  1. 比较指数并相应地将数字的尾数与最小指数对齐,同时添加隐藏位

  2. 把数字变成二进制补码。这需要在尾数左侧有一个额外的位来考虑符号位和另一个位来处理加法溢出。结果,负数将由数字 $gt; 表示。2,即它们的绝对值与 2^3 的补数。请注意,两个最高有效位始终相等。

  3. 执行添加。

  4. 检测溢出。如果结果的两个最高有效位不相等,则存在溢出。在这种情况下,您必须对结果进行算术右移并增加指数。

  5. 检测下溢。如果 point 左边的三位数字相等,则存在下溢。在这种情况下,执行左移直到这三个数字不同或点右侧的所有位都为空,并相应地调整指数。

  6. 四舍五入

  7. 从二进制补码返回符号绝对值表示,并根据其 MSB 确定结果的符号。

例子:

A=1.1 B=-1.1 2^-1

1. alignment. Numbers are extended to 6 bits right of point.

A=+1.100000
B=-0.110000

2. two's complement
A=001.100000
B=2C(000.110000)=111.010000

3 addition

A       001.100000
+B      111.010000
=       000.110000

4 overflows none

5 underflows: shift result left 1 step and decrement exponent
001.100000 2^-1

6 rounding
001.100 2^-1

6 back to sign absolute value
+ (1.)100 2^-1

另一个否定结果的例子

A=1.01 B=-1.1

1. alignment. Numbers are extended to 6 bits right of point.

A=+1.010000
B=-1.100000

2. two's complement
A=001.010000
B=2C(001.100000)=110.100000

3 addition

 A      001.010000
+B      110.100000
=       111.110000

4 overflows none (none overflow can happen if signs are different)

5 underflows: shift result left 2 steps and decrement exponent by 2
111.000000 2^-2

6 rounding
111.000 2^-2 (<0)

6 back to sign absolute value
-(1.)000 2^-2
于 2019-06-19T19:48:42.593 回答
2

你很幸运。假设,您正在使用类似 IEEE754 的表示形式(即,指数以适当的偏差存储),您可以在稍微按摩后简单地按字典顺序比较位字符串。请注意,这假设您已经适当地处理了 NaN 值,因为 NaN 应该简单地通过您的加法器传播。

诀窍是这样的:

  • 您忽略 -0 的符号(即,如果您有 10000000,则将其视为 00000000。)
  • 如果符号位为 1,则翻转所有位(包括符号位)
  • 如果符号位为0,则翻转符号位(保持其他相同)

现在,您可以按字典顺序比较这两个位串,在字典顺序中较早出现的位串较小。您可能必须仔细安排处理方式-0,但我怀疑这对您来说并不是什么大问题。

事实上,这正是指数存储有偏差的原因,这样你就可以通过简单地将它们视为无符号数字来比较浮点数,在完成我上面提到的位翻转技巧之后。

于 2019-06-19T19:07:36.233 回答