如何在按位操作的double之间执行求和

时间:2014-11-04 09:55:55

标签: c++ c floating-point bit-manipulation bitwise-operators

我想知道浮点数总和是如何工作的。 如何使用按位运算对两个双(或浮点)数进行求和?

1 个答案:

答案 0 :(得分:8)

简短回答:如果你需要问,你不会从按位运算符实现浮点加法。这是完全可能的,但您需要先了解一些细微的要点。您可以从实现double→float转换函数开始,它更简单但会向您介绍许多概念。您也可以将{→3>}作为双倍→最接近的整数。

然而,这是添加的天真版本:

为两个操作数中的每一个使用大的位数组(float为254 + 23,double为2046 + 52)。根据指数将有效数字放在数组中的正确位置。假设参数都是规范化的,不要忘记放置隐式前导1.使用通常的exercise规则添加两个位数组。然后将结果数组转换为浮点格式:首先查找最左边的1;最左边1的位置决定了指数。结果的有效位数在该前导1之后立即开始,并且分别为23或52位宽。之后的位确定该值是应该向上舍入还是向下舍入。

虽然这是天真的版本,但它已经非常复杂了。

非天真版本不使用2100位宽阵列,而是利用一些“保护位”(参见binary addition中的“关于舍入”一节)。

其他细微之处包括:

  • 参数的符号位可以表示应该减去加法的幅度,或者为减法添加。
  • 其中一个论点可能是NaN。然后结果是NaN。
  • 其中一个论点可能是无穷大。如果另一个参数是有限的或相同的无穷大,则结果是相同的无穷大。否则,结果是NaN。
  • 其中一个参数可以是非规范化数字。在这种情况下,在将数字传送到位数组以进行添加时,没有前导1。
  • 添加的结果可以是无穷大:取决于实现的细节,这将被认为是指数太大而不适合格式,或者在添加二进制数组期间溢出(溢出也可以在舍入步骤期间发生。)
  • 添加的结果可以是非规范化数。这被认为是在比特阵列的前2046比特中没有前导1。在这种情况下,数组的最后52位应该转移到结果的有效位,并且指数应该设置为零,以指示非规范化结果。