问题描述
|
我正在尝试使用32位寄存器将十进制转换为浮点整数。到目前为止,我必须手动操作(铅笔和纸),我的电话是
1.11010110111100110100010011(base 2) x 2^26
现在我知道尾数只能存储2 ^ 23个叮咬,因此我需要显示使用舍入和不舍入的样子。我的问题是什么决定四舍五入?我知道截断会导致这种情况
1.11010110111100110100010(base 2) x 2^23
舍入只是看向右边的位,如果等于1则向上舍入为1,如果等于0则向下舍入为0?
如果号码是
1.11010110111100110100010111(base 2) x 2^26 where there is a one to the right?
像本例一样,如果2 ^ 3处的位为1,而2 ^ 2(右边)处的位为1,该怎么办?
1.11010110111100110100011111(base 2) x 2^26
谢谢,关于现阶段的四舍五入我还不清楚。
解决方法
二进制数的截断和舍入非常类似于小数。从理论上讲,您将需要查看可用于进行“正确”舍入的尽可能多的位,但是实际上大多数硬件实现在右边使用1或2位来确定是否舍入。
, 通常将舍入到最接近的有效位数。但是,如果值恰好在这些值之间,即如果您要摆脱的最高位是1而其他位是0,则有几个所谓的平局决胜规则:
截断(向0)
向上(向+无限远)
向下(向-无限)
远离0
银行的四舍五入(最接近的有效位数)。
必须应用哪个规则。 AFAIK,大多数FPU默认使用banker的舍入。
在我们的例子中,您丢掉了3个二进制数字。 000被简单地截断; 001-011总是四舍五入; 101-111总是四舍五入,并且100调用平局决胜规则。如果这些规则的结果要四舍五入,则在结果中添加一个最低有效位,并在必要时进行相应的移位。
在第一种情况下,您只需截断位,因为它们低于100,但是如果这是值
1.11010110111100110100011111
而您要删除3位,首先将其截断为
1.11010110111100110100011
但是因为您扔掉的位是111,所以您将其四舍五入,因此您增加了1位,它变成
1.11010110111100110100100
IOW,最低位011变为100