C中的数字功率介于0和1之间

时间:2015-04-10 22:24:03

标签: c math pow

我正在制作一个程序来取代math.h' pow()函数。 我没有使用math.h中的任何函数。

问题是,我可以将权力计算为整数,如

  • 15 -2

  • 45.32 11

但我无法计算

  • X 2.132

我的程序首先找到整数幂x(x 2 )并乘以(x 0.132 )。

我知道x 0.132 是功率132的x的第1000个根但是我无法解决它。

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

2 个答案:

答案 0 :(得分:0)

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

  1. 近似y作为合理分数,(a/b)
  2. (最简单的方法:选择你想要的任何b作为常数获得足够的准确度  然后使用:a = b * y。)

    1. 使用您喜欢的任何方法(例如Newton's)逼近b的{​​{1}}根。
    2. (最简单的方法:你知道它在y0之间,可以很容易地判断给定的值是太低还是太高。所以请保持b从零开始,minmax开始。反复尝试b,看看它是否太大或太小,并调整(min + max) / 2或{{ 1}}恰当。重复直到minmax几乎相同。)

      1. 将其提升为min权力。
      2. (可能通过反复相乘它。如果你愿意,可以优化它。例如,max可以只用两次乘法计算,一次找a,然后一次取平方。很容易概括。)

答案 1 :(得分:0)

使用浮点格式固有的分解将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;
}