如何计算任意功率/根?

NoM*_*ots 6 algorithm math floating-point exponent

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

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

Jas*_*n S 7

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

在任何一种情况下,x m = exp(m log x),所以如果你可以创建函数来计算exp(x)和log(x)并且有一个乘法,你可能都已经设置了.

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

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

exp(x)的对应提示:写x = k + b其中0 <= b <1且k是整数.然后exp(x)= exp(k)*exp(b); b具有有限的范围,k具有有限数量的离散可能性.)

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


eri*_*len 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 <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 <= uv <1.
  5. 再次使用我们的朋友Taylor或Newton-Raphson 计算w = 2 u-v.感兴趣的区间是0 <= uv <1.
  6. 你的答案现在是2 v*w.