我想知道浮点数和如何工作的双重之间进行总和。 我怎样才能总结两个双(或浮点数)使用位运算?如何为位操作
如何为位操作
回答
简短的回答:如果你要问,你是不是要实现从位运算符浮点加法。这是完全可能的,但有一些细节需要你以前问过。你可以通过实现一个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位应该被转换为结果的有效位数,并且指数应该被设置为零,以指示非规格化的结果。
+1“如果你需要问”。这就是那些询问的人的答案不同的问题之一。 – gnasher729 2014-11-04 10:33:06
@ gnasher729我想知道3分钟是否我想关闭为“太宽泛”或回答,而我只是开始回答,因为我不知道即使是简单的方法会有多复杂。不过,如果是从一个开始并且对许多困难中的一个感到困惑的人来说,这将是一个很好的问题。 – 2014-11-04 10:35:50
- 1. 这个按位操作如何工作?
- 2. 按位操作的操作
- 3. 位域三元操作作为左值
- 4. 如何解决操作栏上的操作菜单位置
- 5. java位操作
- 6. 位操作
- 7. 位C操作
- 8. 位操作?
- 9. 位操作AND
- 10. Numpy位操作
- 11. 位操作符
- 12. 有位操作
- 13. 位操作
- 14. 按位操作
- 15. 如何优化MATLAB位操作
- 16. 如何在Swift中使用位操作?
- 17. 如何操作Python中的位?
- 18. 如何反转按位或操作?
- 19. 如何操作位图中的像素?
- 20. 如何在glsl中执行位操作
- 21. 如何操作位汇编语言MIPS32
- 22. 操作栏操作项的位置
- 23. 位操作/操作计算器?
- 24. 将Delphi按位操作转换为Cobol
- 25. 位操作转换为整数
- 26. 如何将输入作为操作
- 27. 按位C操作
- 28. python按位操作
- 29. 位操作功能
- 30. ArrayDeque.allocateElements(按位操作)
你知道如何点浮点数来表示,如IEEE-754? – 2014-11-04 09:57:39
看:https://stackoverflow.com/questions/4743115/how-do-i-use-bitwise-operators-on-a-double-on-c – matekm 2014-11-04 09:59:09
@matekm这个问题是不同的。这个问题是关于实现浮点加法。 – 2014-11-04 10:00:50