计算机是如何计算平方根的
How does the computer calculate Square roots?
计算机如何计算平方根?我是说那里发生了什么!它是如何处理的!!它使用了一些像牛顿方法那样的数学方法吗?三角函数呢?以及几乎所有的数学函数。如果每种语言都有自己的方式,那么请让我们来谈谈c++。
大多数现代非嵌入式CPU(例如x86和更大的ARM内核)都有直接计算平方根的硬件指令。支持这些指令的硬件实现各不相同,但通常是教科书中逐位算法的变体(尽管不总是以2为基数;也可以使用4或16为基数)。这些通常是CPU上最慢的基本算术运算;像16-64个周期这样的定时并不罕见,并且这些指令通常不是流水线式的。
在缺乏直接硬件平方根指令(安腾、PPC等)的CPU上,典型的方法是生成初始估计值(使用产生估计值的指令或查找表),然后使用迭代方法(通常为牛顿或戈德施密特)细化该估计值。如果你感兴趣的话,你可以找到彼得·马克斯坦或罗杰·戈利弗关于这个主题的一些著作。
更复杂的数学函数(如三角运算)通常是通过将自变量减少到一些基本域中,然后用多项式或有理函数对其进行近似来计算的。您可以查看在线提供的几个数学库中的任何一个的来源,以了解更多详细信息(fdlibm是一个很好的起点)。
x86指令集提供了许多支持exp、log和sin等数学函数的指令,但这些指令不再常用,因为良好的软件库实现可以提供更好的性能。
另一种尚未提及的可能性是CORDIC方法。CORDIC在软件中没有广泛使用/已知,但在硬件中非常常见,并且在不使用大量门的情况下可以很好地获得不错的性能。
我认为牛顿迭代收敛方法用于计算平方根
正如其他人所指出的,这是一个非常广泛的问题——对于硬件实现来说,什么对软件有效可能是一个糟糕的选择;然后是IEEE-754、硬件查找表等的正确舍入问题。有很多开源的C库,也有libm
实现。可以在这里找到经典和现代方法的良好概述。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 如何计算数据类型的范围,例如int
- 类似枚举的计算常量
- 使用位移算法计算平方根始终输出相同的数字
- 计算机是如何计算平方根的
- 如何用3个用户定义的函数计算一个数字的真平方根
- 计算数字平方根的程序
- 从不动点计算平方根
- 计算平方根来实现一个不动点函数