[英]IEEE-754 Floating Point Exponent Alignment Issue
我基本上是从头开始制作一个浮点计算器,并且在两个数字不相等的情况下对齐两个数字的指数的部分存在问题。
例如:75.2 + 12.25 = 84.75
但我的程序改为返回 106.5
这是对齐指数的 function 的代码:
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 的尾数部分向右移动多次,以弥补 go 超过 23 位限制的添加位(在这种情况下,它是 3)这也没有问题,让 b 变为0|10000101|00010001000000000000000
就这一点而言,我希望得到正确的结果。 但是,它不会产生正确的数字。 使用其他在线浮点计算器进一步研究,a + b 的结果似乎以二进制表示为0|10000101|01010011000000000000000
。
但是,当将我的两个修改后的尾数加在一起时,这不是我得到的结果。 我在这里做错了什么? 我唯一怀疑的是隐藏位(1)在此过程中没有被移动。 是这样吗?
我应该提一下,我的结构由三个 integer 变量组成,每个变量代表 IEEE-754 浮点格式的各个部分(符号、指数、分数/尾数)。 因此,例如 A 的尾数将是00000000000100010000000000000000
(32 位而不是 23 位,但是当它们都被解析时,它成为浮点数的完整表示)。 此外,我非常肯定我的其他功能正在按预期工作,并且对齐是这里的问题。
有什么建议吗?
我相信即使我一开始就没有解决问题,计算也会出错,因为我是根据指数之间的差异进行移动的,但这意味着我移动了 0 次,因为我将指数设置为彼此相等. 所以这是我的一个愚蠢的疏忽。
实际问题通过设置尾数移位的第 24 位得到解决。 从技术上讲,该位不存在,但正如有人指出的那样,它暗示在那里,并且在发生移位时将被移动。
固定代码如下:
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;
}
感谢那些帮助过的人!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.