Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用逐位运算在double之间执行求和_C++_C_Floating Point_Bit Manipulation_Bitwise Operators - Fatal编程技术网

C++ 如何使用逐位运算在double之间执行求和

C++ 如何使用逐位运算在double之间执行求和,c++,c,floating-point,bit-manipulation,bitwise-operators,C++,C,Floating Point,Bit Manipulation,Bitwise Operators,我想知道浮点数和是如何工作的。 如何使用位运算对两个双精度(或浮点)数字求和?简短回答:如果需要询问,您不打算从位运算符实现浮点加法。这是完全可能的,但有一些微妙的问题,你需要问之前。您可以从实现双线程开始→ 浮点转换函数,它更简单,但会向您介绍许多概念。你也可以做双份→ 最接近的整数 然而,以下是添加的天真版本: 为两个操作数中的每一个使用大的位数组(254+23表示浮点,2046+52表示双精度)。根据指数将有效位放在数组中的正确位置。假设两个参数都是规范化的,不要忘记将隐式前导放在1。按照

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

简短回答:如果需要询问,您不打算从位运算符实现浮点加法。这是完全可能的,但有一些微妙的问题,你需要问之前。您可以从实现双线程开始→ 浮点转换函数,它更简单,但会向您介绍许多概念。你也可以做双份→ 最接近的整数

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

为两个操作数中的每一个使用大的位数组(254+23表示浮点,2046+52表示双精度)。根据指数将有效位放在数组中的正确位置。假设两个参数都是规范化的,不要忘记将隐式前导放在1。按照通常的规则将两个位数组相加。然后将结果数组转换为浮点格式:首先查找最左边的1;最左边的1的位置决定指数。结果的有效位紧跟在前导1之后,分别为23或52位宽。之后的位决定值是向上舍入还是向下舍入

虽然这是一个幼稚的版本,但它已经相当复杂了

非原始版本不使用2100位宽的阵列,而是利用了两个“保护位”(请参阅中的“舍入”一节)

其他微妙之处包括:

  • 参数的符号位可能意味着数量级应该为加法减去,或为减法相加
  • 其中一个参数可以是NaN。那么结果就是NaN
  • 其中一个参数可以是无穷大。如果另一个参数是有限的或相同的无穷大,则结果是相同的无穷大。否则,结果为NaN
  • 其中一个参数可以是非规范化数字。在这种情况下,将数字传输到位数组进行加法时,没有前导1
  • 加法的结果可能是无穷大:取决于实现的细节,这可能被认为是指数太大而不适合格式,或者在二进制数组的加法过程中溢出(溢出也可能在舍入步骤中发生)
  • 加法的结果可以是一个非规范化的数。这被认为是位阵列的前2046位中缺少前导1。在这种情况下,数组的最后52位应转移到结果的有效位,指数应设置为零,以指示非规范化结果

你知道浮点数是如何表示的吗,比如IEEE-754?看看:@matekm这个问题是不同的。这个问题是关于实现浮点加法的。对于这个网站来说可能太宽了。谷歌“浮点运算是如何实现的”。很多好结果。+1表示“如果你需要问”。这是一个对提问的人来说答案不同的问题。@gnasher729我想了3分钟,我是想以“太宽泛”结束还是想回答,我只是开始回答,因为我不知道即使是简单的方法也会变得多么复杂。尽管如此,如果这个问题是由一个刚开始的人提出的,他对许多困难中的一个感到困惑,那将是一个很好的问题。