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位应转移到结果的有效位,指数应设置为零,以指示非规范化结果