如果精度不重要,是否有某种方法可以提高速度的倒数(X 上的除法 1)?
所以,我需要计算 1/X。是否有一些解决方法,所以我会失去精度但做得更快?
原文由 klm123 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果精度不重要,是否有某种方法可以提高速度的倒数(X 上的除法 1)?
所以,我需要计算 1/X。是否有一些解决方法,所以我会失去精度但做得更快?
原文由 klm123 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答3.3k 阅读
𝗛𝗲𝗿𝗲’𝘀𝗧𝗼𝗔𝗽𝗽𝗿𝗼𝘅𝗶𝗺𝗮𝘁𝗲𝗠𝗼𝗿𝗲𝗘𝗳𝗳𝗶𝗰𝗶𝗲𝗻𝘁𝗹𝘆
我相信他正在寻找的是一种更有效的近似 1.0/x 的方法,而不是一些近似的技术定义,即你可以使用 1 作为一个非常不精确的答案。我也相信这可以满足这一点。
嗯.. 如果 CPU 制造商在设计 CPU 时知道您可以只用一次乘法、减法和位移来近似倒数,那我就想知道了…. 嗯…….. .
至于基准测试,硬件 x 2指令结合硬件减法指令与现代计算机上的硬件 1.0/x 指令一样快(我的基准测试是在 Intel i7 上,但我假设其他处理器的结果类似) .但是,如果该算法作为新的汇编指令在硬件中实现,那么速度的提高可能足以使该指令非常实用。
有关此方法的更多信息,此实现基于出色的 “快速”逆平方根算法。
正如 Pharap 引起我注意的那样,从联合中读取非活动属性是未定义的行为,因此我从他的有用评论中设计了两种可能的解决方案来避免未定义的行为。第一个解决方案似乎更像是一个令人讨厌的技巧来绕过实际上并不比原始解决方案更好的语言语义。
第二种可能的解决方案更受欢迎,因为它完全摆脱了工会。但是,如果编译器没有正确优化,这个解决方案会慢很多。但是,从好的方面来说,下面的解决方案将完全不知道所提供的字节顺序:
免责声明: 最后,请注意,我是 C++ 的新手。因此,我张开双臂欢迎任何最佳实践、正确格式或含义清晰的编辑,以提高所有阅读者的答案质量,并扩展我多年来对 C++ 的了解来。