如何计算任意功率/根?
Posted
技术标签:
【中文标题】如何计算任意功率/根?【英文标题】:How to calculate an arbitrary power/root? 【发布时间】:2009-09-03 21:05:30 【问题描述】:我有一个应用程序需要将数字提高到分数幂。目标平台是 FPGA,我可以估计它的 FPU 大小,但我需要一种算法来将数字提升到分数幂,以进行可行性研究。我假设浮点是最坏的情况,我希望在实践中我们能够使用捷径,但现在我想证明我们可以实现最坏的情况。
我想我会在这里问一下,看看是否有任何我可以检查的常用方法。我知道有这样做的软件方法,我只想要一个相当有效的算法开始。我会担心 FPGA 的实现。
【问题讨论】:
【参考方案1】:您的输入范围是任意的,还是在某个范围内已知?
在任何一种情况下,xm = exp(m log x),所以如果您可以创建函数来计算 exp(x) 和 log(x) 并进行乘法运算,那么您可能可以了,好了。
您必须弄清楚要如何处理 x 的非正值。
(log(x) 的提示:如果这是IEEE-754 floating point,则根据需要移动有效位,直到最终得到介于 2k 和 2k+1 之间的数字范围
exp(x) 的相应提示:写 x = k+b 其中 0
(提示 #2:xm = g(m f(x)) 其中 f(x) = log2x 和 g 的数字可能更好(x) = 2x.)
【讨论】:
我现在假设是任意的,我必须阅读更多系统的计算背后的理论正在执行。现在只是试图向客户提出解决方案。我只是想分析证明它可以在我们的系统上完成。 +1。不久前,我在一个奇怪的运行时工作,它缺少完整的 FP 库,但提供了 frexp/ldexp 例程来分离和重新组合指数和尾数;由此,构建标准 FP 函数相当简单。 实际上,特别是在一种情况下,指数看起来会 > 1。我不确定这是否适用于所有情况。【参考方案2】:正如 Jason S 所说,这是使用恒等式 xm = exp(m log x) 完成的。但在实践中,您将不得不处理截断错误。 我认为通常这样做的方式是
-
使用此标识:xm = (2n * x / 2n)m = 2 nm * (x/2n)m 并找到一个整数 n 使得 1 n
计算 t = log2(x / 2n)。这可以使用足够高程度的泰勒展开或使用良好的牛顿-拉夫森来完成。您必须确保区间 [1, 2[ 的最大误差对您来说不会太大。
计算 u = nm + tm。
我们现在的目标是计算 2u。使用 2u = 2v * 2u-v 的事实并找到一个整数 v 使得 0
再次使用我们的朋友 Taylor 或 Newton-Raphson 计算 w = 2u-v。感兴趣的区间是 0
您的答案现在是 2v * w.
【讨论】:
您究竟是如何使用牛顿拉夫森计算对数函数的?我可以找到使用它的 divison 算法,但是 google 上有太多“噪音”,无法找到如何使用它来计算日志。 我想我从我的计算理论中记得这是可能的,但我可能错了。我不是数学家。 你用它来计算任何函数都是一样的——它基本上是一个 f(x) = 0 的数值求解器,给定一对起点 x1,x2 并保证解决方案介于两者之间。以上是关于如何计算任意功率/根?的主要内容,如果未能解决你的问题,请参考以下文章
java读取项目根路径下和任意磁盘位置下的properties文件