繁体   English   中英

如何对两个IEEE754单精度数字之和进行归一化?

[英]How to normalize the sum of two IEEE754 single precision numbers?

我正在SystemVerilog中设计一个浮点单元,该单元采用两个IEEE754格式的32位输入,将它们加在一起,然后以相同的32位IEEE754格式输出结果。

我的问题是,如何判断我的结果是否需要归一化?

我知道是在您需要将“最左边的” 1移动到正确的位(应该是位23)时(从位0开始)。

我头疼的是,如何确定正确的“最左边的” 1位是什么,以便可以移动尾数​​并适当地增加/减少指数位。

如果我的理解是正确的,加法应该有以下过程。

  • 将位分成符号,指数和尾数
  • 尾数前加1
  • 比较指数并将差异加到较小的指数上
  • 通过上述差异将较小指数的尾数向右移动,以正确地“对齐”小数/数字
  • 执行二进制加法
  • 必要时将结果标准化

我相信除了规范化部分正确之外,我已经采取了所有措施。 我的问题是,如果我所有的都是位,如何确定结果未归一化?

我知道如果结果不是1.(分数)则无法标准化。
即。 应将10.10101 * 2 ^ 1标准化为1.010101 * 2 ^ 2,并将.1001 * 2 ^ 2标准化为1.001 * 2 ^ 1。

具体来说,我想我想问一个加两个数字后如何跟踪“小数”位置在哪里。

例如:添加输入a:0x3fc00000(1.5)和b:0x40500000(3.25)

a = 0 | 0111 1111 | (1)100 0000 0000 0000 0000 0000
b = 0 | 1000 0000 | (1)101 0000 0000 0000 0000 0000

a的指数小于b的差1,因此:

a = 0 | 1000 0000 | 0(1)10 0000 0000 0000 0000 0000
b = 0 | 1000 0000 | (1)101 0000 0000 0000 0000 0000

添加尾数将使我们得到

1 0011 0000 0000 0000 0000 0000

在这里,我们看到“最左边的” 1是第24位,而不是第23位,因此我们将尾数向右移动1并增加指数以对结果进行归一化。 然后我们删除“最左边的” 1,因为它以IEEE754格式隐含,我们得到:

0 | 1000 0001 | 001 1000 0000 0000 0000 0000(4.75)作为我们的最终输出是正确的。

给出这个例子,我认为我只需要检查以下情况:

  • 如果尾数的第24位等于1,则将尾数右移并增加指数
  • 其他检查位23为1,如果为true,则无需标准化
  • 否则,检查位22为1,然后向左移动尾数并减小指数

但是,我只发现在某些情况下是正确的。 我想念什么?

在我的实现中,我做了一个26位的值来保存两个尾数的和,我不确定这是正确的。 第25位是尾数的符号,我并不是我真正需要的,而第24位和第23位是隐藏位,或者最终输出中将不包含的位。

例如:0x449ebbc8(1269.868163)+ 0xc60eb709(-9133.758561)给我以下尾数:

11 0111 1010 1101 1111 1001 0000请注意,这是26位(25:0)

如果我遵循前面的情况,那将意味着除符号位之外的“最左1”位将为24,这意味着我将向右移动尾数并增加指数。 但是正确的答案是相反的! “'真'最左边的1”位实际上是22位! 意思是我应该左移并递减! 给我最终的输出:

1 | 10001011 | 111 0101 1011 1111 0010 0000(-7863.8906)是正确的。

同样,将0x45c59cbd和0xc473d9dc相加得出的尾数为

01 1010 0111 0010 0001 1000 0010,但“最左边的1”位不是第24位,而是第23位,因此不需要归一化。

为什么在第一种情况下,我需要担心第24位,而在其他两种情况下却无需担心? 是因为我在其他情况下添加了相反的符号吗? 溢出问题? 还是我根本缺少的东西?

感谢您的帮助,如果格式不正确,请谅解!

考虑以IEEE-754基本32位二进制格式添加两个正数。 当他们的有效数1通过前缀前导位完成时,转移到对准的指数,并添加,引导位或者处于相同的位置(因为没有发生进位)或一个向左(因为发生了进位)。 要对此进行归一化,如果发生进位,只需向右移一位。

(如果两个数字均是次正规的,则前导位可能在右侧。但是,将不会进行归一化,因为结果要么被带入使其变为正常的位置(因此不需要归一化),要么没有被带入该位置。位置[因此结果仍然是次标准的,无法归一化]。)

如果两个数字均为负,则情况相同。 有效位数可以被视为绝对值,而忽略符号位。

如果数字相反,则表示并发症。 该问题描述了将符号位前缀到有效位。 这似乎不会导致正确的结果。 例如,考虑添加+1.125和−1.125。 每个数字的四位有效位数为1001。将符号位前缀分别给我们01001和11001。 然后将其相加得到1 00010(新的最左边的数字来自前一个最左边位置的进位)。 不管我们如何处理前导位,低位都是错误的-0010不正确; 由于+1.125 + −1.125 = 0,结果应为0000,且带有一些符号。 因此,仅将符号位前缀为有效位是不正确的过程。

我记得关于实现浮点加法的每一种描述都指定在符号相反时使用减法而不是加法。 在这种情况下,必须从较大(或相等)的数中减去较小(或相等)的数,然后必须向左移一些位数(可能为零)。

在此模型中,确定如何标准化数字变得更加简单:

  • 当添加类似符号的数字时,归一化要求根据从高位置是否有进位来向右移零或一位。 (请注意,可能会发生指数溢出。)
  • 当减去对号时,归一化要求向左移动,直到前一位位于正确位置或达到最小指数为止。

我希望可以使用加法和二进制补码算法来实现混合符号的情况。 在这种情况下,不仅应在符号位之前加上符号位,还应通过将每个位取反然后加1来形成符号的二进制补码。 一旦找到总和,如果它是负数,则可以再次用二进制补码,然后将其标准化。 但是,您随后要在实现中添加更多的附加内容,以及它们的进位链依赖性。

请注意,您还必须考虑对结果进行四舍五入,因为在移位之前,为了对齐指数,在移位之前可能会丢失一些位,而在进行移位时,为了归一化类似符号号的结果,可能会丢失一些位。

脚注

1 “有效位数”是浮点数小数部分的首选术语。 “ Mantissa”是对数的小数部分的历史术语。 有效数字是线性的(将有效数字加倍将表示的值加倍),而尾数是对数的(将尾数加倍则将其代表的值的一部分平方)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM