2014-11-04 50 views
0

我想知道浮点数和如何工作的双重之间进行总和。 我怎样才能总结两个双(或浮点数)使用位运算?如何为位操作

+3

你知道如何点浮点数来表示,如IEEE-754? – 2014-11-04 09:57:39

+0

看:https://stackoverflow.com/questions/4743115/how-do-i-use-bitwise-operators-on-a-double-on-c – matekm 2014-11-04 09:59:09

+0

@matekm这个问题是不同的。这个问题是关于实现浮点加法。 – 2014-11-04 10:00:50

回答

8

简短的回答:如果你要问,你是不是要实现从位运算符浮点加法。这是完全可能的,但有一些细节需要你以前问过。你可以通过实现一个double→float转换函数来开始,它更简单,但会向你介绍许多概念。你也可以做双→最接近的整数作为exercise

尽管如此,这里是另外的幼稚版本:

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

虽然这是天真的版本,这已经是相当复杂的。

非天真版本不使用2100位宽阵列,而是利用一些“保护位”代替(请参见this document中的“四舍五入”部分)。

附加微妙之处包括:

  • 的参数的符号位可意味着大小应减去的添加,或添加了一个减法。
  • 其中一个参数可以是NaN。那么结果是NaN。
  • 其中一个参数可以是无穷大。如果另一个参数是有限或相同的无穷大,结果是相同的无穷大。否则,结果是NaN。
  • 其中一个参数可以是非规格化的数字。在这种情况下,在将数字传送到位数组进行添加时,不会有前导1。
  • 加法的结果可以是一个无穷大:根据实现的细节,这将被认为是指数太大而不适合格式,或者在添加二进制数组时溢出(溢出也可以在舍入步骤期间发生)。
  • 加法的结果可以是非规格化的数字。这被认为是在比特阵列的前2046比特中缺少前导1。在这种情况下,数组的最后52位应该被转换为结果的有效位数,并且指数应该被设置为零,以指示非规格化的结果。
+0

+1“如果你需要问”。这就是那些询问的人的答案不同的问题之一。 – gnasher729 2014-11-04 10:33:06

+0

@ gnasher729我想知道3分钟是否我想关闭为“太宽泛”或回答,而我只是开始回答,因为我不知道即使是简单的方法会有多复杂。不过,如果是从一个开始并且对许多困难中的一个感到困惑的人来说,这将是一个很好的问题。 – 2014-11-04 10:35:50