Assembly 浮点加法汇编算法
我正在尝试为一个微微化微控制器编写一个二进制8位浮点加法算法(1个符号位、4个指数位和3个尾数位) 我可以用正数,但当有负数的时候我不知道怎么做 我的主要问题是设置结果的符号位,有人能解释一下如何正确设置吗Assembly 浮点加法汇编算法,assembly,floating-point,addition,signed,picoblaze,Assembly,Floating Point,Addition,Signed,Picoblaze,我正在尝试为一个微微化微控制器编写一个二进制8位浮点加法算法(1个符号位、4个指数位和3个尾数位) 我可以用正数,但当有负数的时候我不知道怎么做 我的主要问题是设置结果的符号位,有人能解释一下如何正确设置吗 我的想法是检查两个数字的符号;如果它们都是正数,则将符号设置为0,如果它们都是负数,则将符号设置为1,并使用与之前相同的方法进行加法,如果一个是负数,一个是正数,则比较数字并使用较大数字的符号位,但我不确定如何比较这两个数字,代码变得有点混乱,有更好的方法吗?你很幸运。假设您使用的是类似IE
我的想法是检查两个数字的符号;如果它们都是正数,则将符号设置为0,如果它们都是负数,则将符号设置为1,并使用与之前相同的方法进行加法,如果一个是负数,一个是正数,则比较数字并使用较大数字的符号位,但我不确定如何比较这两个数字,代码变得有点混乱,有更好的方法吗?你很幸运。假设您使用的是类似IEEE754的表示法(即,指数是以适当的偏差存储的),则只需在经过一点处理后按字典顺序比较位字符串即可。注意,这假设您已经适当地处理了NaN值,因为NaN值应该只通过加法器传播 诀窍在于:
- 忽略-0符号(即,如果有10000000,则将其视为00000000。)
- 如果符号位为1,则翻转所有位(包括符号位)
- 如果符号位为0,则翻转符号位(保持其他符号位不变)
-0
,但我怀疑这对您来说不是什么大问题
事实上,这正是指数以偏置方式存储的原因,这样,在执行了我上面提到的位翻转技巧之后,只需将浮点数视为无符号数,就可以比较浮点数。如果将它们转换为2的补码,则不必关心操作数的符号
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
A=1.01b=-1.1
1.对齐数字扩展到点右侧的6位。
A=+1.010000
B=-1.100000
2.二元补码
A=001.010000
B=2C(001.100000)=110.100000
3增加
A 001.010000
+B 110.100000
= 111.110000
4溢出无(如果符号不同,则不会发生溢出)
5下溢:将结果向左移动2步,并将指数递减2
111.000000 2^-2
6四舍五入
111.000 2^-2(通常(忽略像NaN这样的事情),对于A=B+C
:
- 如果
C
的幅值大于B
,请交换B
和C
,以便知道B
必须具有“大于或等于”的幅值。注意:幅值忽略符号位(例如-6的幅值大于+4,因为6>4)
- 如果
B
和C
有不同的符号,则取反C
并执行减去内部
;否则执行添加内部
- 对于
subtract_internal
,忽略符号位,减去大小(不要忘记B
必须具有“较大或相等”的大小),然后将A
的符号设置为等于B
或C
的符号(它们无论如何都具有相同的符号)
- 对于
add_internal
,忽略符号位,添加大小,然后将A
的符号设置为等于B
或C
的符号(它们将具有相同的符号)
另外,一般来说(忽略NaN之类的内容),对于A=B-C
:
- 如果
C
的幅值大于B
,则交换B
和C
,并将两者都取反(例如A-C==(-C)-(-A)
),以便您知道B
必须具有“更大或相等”的幅值
- 如果
B
和C
有不同的符号,则对C
取反,然后执行添加内部
;否则执行减去内部
取决于您使用的浮点格式,即在输入加法器之前对数据做什么以及之后做什么。谢谢,这很有帮助谢谢您的帮助!