如何计算任意功率/根?

时间:2009-09-03 21:05:30

标签: algorithm math floating-point exponent

我有一个应用程序需要将一个数字提升到一个分数幂。目标平台是一个FPGA,我可以得到它的FPU大小的估计,但我需要一个算法,只是为了可行性研究将数字提高到一个分数功率。我假设浮动点是最坏的情况,我希望在实践中我们能够使用捷径,但是现在我想表明我们可以实施最坏的情况。

以为我会问这里,看看是否有任何常见的方法可以结账。我知道有这样做的软件方法,我想要一个合理有效的算法开始。我会担心FPGA的实现。

2 个答案:

答案 0 :(得分:7)

您的输入范围是任意的,还是在一定范围内已知?

在任何一种情况下,x m = exp(m log x),所以如果你可以创建函数来评估exp(x)和log(x)并且有一个乘法,你可能搞定。

您必须弄清楚如何处理x的非正值。

(提示log(x):如果这是IEEE-754 floating point,则根据需要移位有效数字,直到最终得到2 k 和2 k之间的数字范围+1 表示某个值K.这可以让你处理2:1的范围,这个范围不太难以用多项式逼近。那么你只需要少量的可能来处理指数和转移数

exp(x)的对应提示:写x = k + b其中0 <= b

(提示#2:对于x m = g(mf(x)),数字可能更好,其中f(x)= log 2 x和g (x)= 2 x 。)

答案 1 :(得分:5)

正如Jason S所说,这是使用身份x m = exp(m log x)完成的。但实际上,您必须处理截断错误。 我认为通常这样做的方式是

  1. 使用此标识:x m =(2 n * x / 2 n m = 2 nm *(x / 2 n m 并找到整数n,使得1 <= x / 2 n &lt; 2。
  2. 计算t = log2(x / 2 n )。这可以使用足够高度的泰勒展开,或使用良好的'Newton-Raphson'来完成。您必须确保区间内的最大误差[1,2 [对您来说不是太大。
  3. 计算u = nm + tm。
  4. 我们的目标是计算2 u 。使用2 u = 2 v * 2 u-v 的事实,并找到整数v,使得0 <= u-v <1。 1。
  5. 再次使用我们的朋友Taylor或Newton-Raphson计算w = 2 u-v 。感兴趣的间隔是0 <= u-v <0。 1。
  6. 你的答案现在是2 v * w。