C 中 0 到 1 之间的数次幂
A numbers power between 0 and 1 in C
我正在编写一个程序来替换 math.h 的 pow()
函数。
我没有使用 math.h.
中的任何函数
问题是,我可以像
这样的整数计算幂
15-2
45.3211
但是我不会计算
- x2.132
我的程序首先求出x的整数次幂(x2)然后乘以(x0.132).
我知道 x0.132 是 x 的 132 次方的 1000 次方根,但我无法求解。
如何找到 xy (0 < y < 1)
计算 x ^ y
, 0 < y < 1 :
- 近似
y
作为有理分数,(a/b)
(最简单的方法:选择任何 b
你想要获得足够准确度的常量。
然后使用:a = b * y
.)
- 使用您喜欢的任何方法(例如牛顿法)逼近
y
的 b
根。
(最简单的方法:你知道它在 0
和 b
之间,并且可以很容易地判断给定值是太低还是太高。所以保持一个 min
从零和一个从b
开始的max
。反复尝试(min + max) / 2
,看它是否太大或太小,并适当调整min
或max
。重复直到 min
和 max
几乎相同。)
- 将其提高到
a
次方。
(可能是通过重复自乘。如果你愿意,可以优化它。例如,a^4
可以通过两次乘法计算,一次找到 a^2
,然后一次计算它的平方. 这很容易概括。)
使用浮点格式固有的因式分解将 x=2^e*m
与 1<=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;
}
我正在编写一个程序来替换 math.h 的 pow()
函数。
我没有使用 math.h.
问题是,我可以像
这样的整数计算幂15-2
45.3211
但是我不会计算
- x2.132
我的程序首先求出x的整数次幂(x2)然后乘以(x0.132).
我知道 x0.132 是 x 的 132 次方的 1000 次方根,但我无法求解。
如何找到 xy (0 < y < 1)
计算 x ^ y
, 0 < y < 1 :
- 近似
y
作为有理分数,(a/b)
(最简单的方法:选择任何 b
你想要获得足够准确度的常量。
然后使用:a = b * y
.)
- 使用您喜欢的任何方法(例如牛顿法)逼近
y
的b
根。
(最简单的方法:你知道它在 0
和 b
之间,并且可以很容易地判断给定值是太低还是太高。所以保持一个 min
从零和一个从b
开始的max
。反复尝试(min + max) / 2
,看它是否太大或太小,并适当调整min
或max
。重复直到 min
和 max
几乎相同。)
- 将其提高到
a
次方。
(可能是通过重复自乘。如果你愿意,可以优化它。例如,a^4
可以通过两次乘法计算,一次找到 a^2
,然后一次计算它的平方. 这很容易概括。)
使用浮点格式固有的因式分解将 x=2^e*m
与 1<=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;
}