首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IEEE-754浮点指数对齐问题

IEEE-754浮点指数对齐问题
EN

Stack Overflow用户
提问于 2020-07-26 18:57:08
回答 1查看 194关注 0票数 0

我正在从头开始做一个浮点计算器,在两个数字的指数不相等的情况下,我遇到了一个问题。

例如: 75.2 + 12.25 = 84.75

但是我的程序返回的是106.5

以下是对齐指数的函数的代码:

代码语言:javascript
复制
void align(MyStruct* a, MyStruct* b)
{
   if (a->exponent > b->exponent)
   {
      b->exponent = a->exponent; // Sets the exponent of b = to a 
      b->fraction >>= a->exponent - b->exponent // Shifts the mantissa (fraction) bits of b to the right
   }
   return;
}

我不知道我做错了什么。上面示例方程的二进制表示如下所示:

0|10000101|00100010000000000000000 A

0|10000010|10001000000000000000000 B +

当我做b->exponent = a->exponent;时,我希望它能使b

0|10000101|10001000000000000000000,它进行得很顺利。然后我期望b的尾数部分右移许多次,因为需要多次右移以弥补超过23位限制的添加位(在本例中,它是3)这也没有问题地发生,留下b成为0|10000101|00010001000000000000000

到目前为止,我希望得到正确的结果。但是,它不会产生正确的数字。通过其他在线浮点计算器进一步研究,a+b的结果似乎以二进制形式表示为0|10000101|01010011000000000000000

然而,当我将两个修改过的尾数加在一起时,我得到的结果并不是这样的。我在这里做错了什么?我唯一怀疑的是隐藏的位( 1)在这个过程中没有被移位。真的是这样吗?

值得一提的是,我的结构由三个整数变量组成,每个变量代表IEEE-754浮点格式的各个部分(符号、指数、分数/尾数)。例如,A的尾数应该是00000000000100010000000000000000 (32位而不是23位,但当它们都被解析后,它就变成了浮点数的完整表示)。此外,我非常肯定我的其他函数可以正常工作,并且align是这里的问题所在。

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2020-07-26 20:00:06

我认为即使我一开始没有解决这个问题,计算也是错误的,因为我是根据指数之间的差异进行移位的,但是这意味着我将移位0次,因为我将指数设置为彼此相等。,,

  1. 。所以这是我的一个愚蠢的疏忽。

  1. 通过设置被移位的尾数中的第24位解决了实际问题。从技术上讲,这个比特并不存在,但正如有人指出的那样,它暗示着它就在那里,当移动发生时,它将被移动。

固定的代码将为:

代码语言:javascript
复制
void align(MyStruct* a, MyStruct* b)
{
    if (a->exponent != b->exponent) // If the exponents are not equal
    {
        if (a->exponent > b->exponent)
        {
            int disp = a->exponent - b->exponent; // number of shifts needed based on difference between two exponents
            a->fraction |= 1 << 23; // sets the implicit bit for shifting
            b->exponent = a->exponent; // sets exponents equal to each other
            a->fraction >>= disp; // mantissa is shifted over to accommodate for the increase in power
            return;
        }
        int disp = b->exponent - a->exponent;
        a->fraction |= 1 << 23;
        a->exponent = b->exponent;
        a->fraction >>= disp;
        return;
    }
    return;
}

感谢那些帮助我们的人!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63099176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档