我正在从头开始做一个浮点计算器,在两个数字的指数不相等的情况下,我遇到了一个问题。
例如: 75.2 + 12.25 = 84.75
但是我的程序返回的是106.5
以下是对齐指数的函数的代码:
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是这里的问题所在。
有什么建议吗?
发布于 2020-07-26 20:00:06
我认为即使我一开始没有解决这个问题,计算也是错误的,因为我是根据指数之间的差异进行移位的,但是这意味着我将移位0次,因为我将指数设置为彼此相等。,,
固定的代码将为:
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;
}感谢那些帮助我们的人!
https://stackoverflow.com/questions/63099176
复制相似问题