计算机如何计算平方根?我是说那里发生了什么!它是如何处理的!!它使用了一些像牛顿方法那样的数学方法吗?三角函数呢?以及几乎所有的数学函数。如果每种语言都有自己的方式,那么请让我们来谈谈c++。
大多数现代非嵌入式CPU(例如x86和更大的ARM内核)都有直接计算平方根的硬件指令。支持这些指令的硬件实现各不相同,但通常是教科书中逐位算法的变体(尽管不总是以2为基数;也可以使用4或16为基数)。这些通常是CPU上最慢的基本算术运算;像16-64个周期这样的定时并不罕见,并且这些指令通常不是流水线式的。
在缺乏直接硬件平方根指令(安腾、PPC等)的CPU上,典型的方法是生成初始估计值(使用产生估计值的指令或查找表),然后使用迭代方法(通常为牛顿或戈德施密特)细化该估计值。如果你感兴趣的话,你可以找到彼得·马克斯坦或罗杰·戈利弗关于这个主题的一些著作。
更复杂的数学函数(如三角运算)通常是通过将自变量减少到一些基本域中,然后用多项式或有理函数对其进行近似来计算的。您可以查看在线提供的几个数学库中的任何一个的来源,以了解更多详细信息(fdlibm是一个很好的起点)。
x86指令集提供了许多支持exp、log和sin等数学函数的指令,但这些指令不再常用,因为良好的软件库实现可以提供更好的性能。
另一种尚未提及的可能性是CORDIC方法。CORDIC在软件中没有广泛使用/已知,但在硬件中非常常见,并且在不使用大量门的情况下可以很好地获得不错的性能。
我认为牛顿迭代收敛方法用于计算平方根
正如其他人所指出的,这是一个非常广泛的问题——对于硬件实现来说,什么对软件有效可能是一个糟糕的选择;然后是IEEE-754、硬件查找表等的正确舍入问题。有很多开源的C库,也有libm
实现。可以在这里找到经典和现代方法的良好概述。