C 中 0 到 1 之间的数次幂

A numbers power between 0 and 1 in C

我正在编写一个程序来替换 math.h 的 pow() 函数。 我没有使用 math.h.

中的任何函数

问题是,我可以像

这样的整数计算幂

但是我不会计算

我的程序首先求出x的整数次幂(x2)然后乘以(x0.132).

我知道 x0.132 是 x 的 132 次方的 1000 次方根,但我无法求解。

如何找到 xy (0 < y < 1)

计算 x ^ y, 0 < y < 1 :

  1. 近似y作为有理分数,(a/b)

(最简单的方法:选择任何 b 你想要获得足够准确度的常量。
然后使用:a = b * y.)

  1. 使用您喜欢的任何方法(例如牛顿法)逼近 yb 根。

(最简单的方法:你知道它在 0b 之间,并且可以很容易地判断给定值是太低还是太高。所以保持一个 min 从零和一个从b开始的max。反复尝试(min + max) / 2,看它是否太大或太小,并适当调整minmax。重复直到 minmax 几乎相同。)

  1. 将其提高到 a 次方。

(可能是通过重复自乘。如果你愿意,可以优化它。例如,a^4 可以通过两次乘法计算,一次找到 a^2,然后一次计算它的平方. 这很容易概括。)

使用浮点格式固有的因式分解将 x=2^e*m1<=m<2 分开来创建子问题 2^(e*y)m^y

使用平方根,x^y=sqrt(x)^(2*y) 如果 2*b 中有整数部分,将其分开。

x使用二项式定理接近1,迭代平方根时会出现

(1+h)^y=1+y*h+(y*(y-1))/2*h^2+...+binom(y,j)*h^j+...

其中一项与下一项的商为 (y-j)/(j+1)*h

h=x-1;
term = y*h;
sum = 1+term;
j=1;
while(1+term !=1) {
    term *= h*(y-j)/(1+j);
    sum += term;
    j+=1;
}