计算机如何计算平方根? [关闭]

Posted

技术标签:

【中文标题】计算机如何计算平方根? [关闭]【英文标题】:How does the computer calculate Square roots? [closed] 【发布时间】:2012-08-31 12:55:51 【问题描述】:

计算机如何计算平方根? 我的意思是那里发生了什么!它是如何处理的!! 它是否使用了一些数学方法,如牛顿法? 三角函数呢?几乎所有的数学函数。 既然每种语言都有自己的方式,那我们来聊聊c++吧。

【问题讨论】:

你的问题太宽泛了。看看en.wikipedia.org/wiki/Methods_of_computing_square_roots How does C compute sin() and other math functions?的可能重复 【参考方案1】:

我认为牛顿的迭代收敛方法用于计算平方根

【讨论】:

【参考方案2】:

大多数现代非嵌入式 CPU(例如 x86 和更大的 ARM 内核)都具有直接计算平方根的硬件指令。支持这些指令的硬件实现各不相同,但通常是教科书逐位算法的变体(尽管并不总是以 2 为底;也可以使用以 4 或 16 为底的算法)。这些通常是 CPU 上最慢的基本算术运算。像 16-64 个周期这样的时序并不少见,而且这些指令通常不是流水线的。

在缺少直接硬件平方根指令的 CPU(安腾、PPC 等)上,典型的方法是生成初始估计值(使用产生估计值的指令或使用查找表),然后细化该估计值使用迭代方法(通常是牛顿或戈德施密特)。如果您有兴趣,可以查找一些 Peter Markstein 或 Roger Golliver 关于该主题的著作。

更复杂的数学函数(如三角运算)通常通过将参数减少到某个基本域然后用多项式或有理函数逼近它来计算。您可以查看在线提供的多个数学库中的任何一个的来源以获取更多详细信息(fdlibm 是一个很好的起点)。

x86 指令集提供了许多支持数学函数的指令,如 exp、log 和 sin,但这些已不再常用,因为好的软件库实现可以提供更好的性能。

【讨论】:

关于软件平方根的话题:你是这段代码的作者吗? opensource.apple.com/source/Libm/Libm-2026/Source/ARM/… 什么是许可证?它可以在 GPLv3 下使用吗?谢谢。 @airafr 该文件的许可证与大多数 Apple 的开源一样,是 APSL v2。【参考方案3】:

正如其他人所指出的那样,这是一个非常广泛的问题 - 什么对软件有效,但对于硬件实现来说可能是一个糟糕的选择;然后是 IEEE-754、硬件查找表等的正确舍入问题。有很多开源 C 库,也有 libm 实现。可以在here 找到经典和现代方法的一个很好的概述。

【讨论】:

【参考方案4】:

另一种未提及的可能性是CORDIC method。 CORDIC 在软件中没有被广泛使用/广为人知,但在硬件中很常见,并且在不使用大量门的情况下也能很好地获得不错的性能。

【讨论】:

嗯,不过从文章看好像是软件优化的方法? @Pacerier:我在文章中没有看到任何暗示(尽管我在软件中也非常成功地使用了它)。

以上是关于计算机如何计算平方根? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 vDSP / Accelerate in swift for iOS 计算向量元素的平方根

在 DataFrame 中操作数据:如何计算列的平方

如何使用 Python 和 Numpy 计算 r 平方?

如何在不使用内置函数的情况下计算数字的平方根? [重复]

C#编写简单计算器

用C语言编写一个计算器程序,实现加,减,乘,除,求平方根(正数),倒数等功能.