【问题标题】:Floating-point addition assembly algorithm浮点加法组装算法
【发布时间】:2019-11-02 13:39:06
【问题描述】:

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

我让它可以处理正数,但是当也有负数时我不知道该怎么做。

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

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

【问题讨论】:

  • 取决于您使用的浮点格式,在您输入加法器之前对数据执行的操作以及之后执行的操作。

标签: assembly floating-point addition signed picoblaze


【解决方案1】:

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

  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

【讨论】:

  • 谢谢,这很有帮助
【解决方案2】:

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

  • 如果C 的幅度大于B,则交换B 和C,这样您就知道B 的幅度必须“更大或相等”。 注意:幅度忽略符号位(例如,-6 的幅度大于 +4,因为 6 > 4)。

  • 如果B和C有不同的符号,否定C并做subtract_internal;否则add_internal。

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

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

另外,对于A = B - C,一般情况下(忽略 NaN 之类的东西):

  • 如果C 的量级大于B,则交换B 和C 并将它们都取反(例如A - C == (-C) - (-A)),这样您就知道B 必须具有“更大或相等”的大小。

  • 如果B和C有不同的符号,否定C并做add_internal;否则subtract_internal。

【讨论】:

    【解决方案3】:

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

    诀窍是这样的:

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

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

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

    【讨论】:

    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多