|
|
●概要 求める値の逆数をニュートン法で求める。指数関数で、X0.5 では時間が掛かりすぎる。 ●原理 ○基本式 通常、Y = X2 - a とし、漸化式を Xn+1 = Xn - 1 / 2 * (X2 - a) / X となり、漸化式に逆数あるいは除算が現われ、速度的に不利となる。 ○高速化 ・平方根 根の逆数(1/Sqrt(a))を求めることにすれば、関数は、 f(X) = 1 / X2 - a となる。これを、漸化式にすると、 Xn+1 = Xn - (1 / 2) * Xn * (a * Xn2 - 1) となる。ここには、多倍長同士の除算は含まれていない。また、δ = X * (a * X2 - 1) とすれば、収束条件にもなる。 Sqrt(a) = (1/Sqrt(a)) * a なので、最後に一回乗算する。 ・立方根 同様に解くと、漸化式は、 Xn+1 = Xn - (1 / 3) * Xn * (a * Xn3 - 1) となる。この場合、最後に逆数を求める。 ●演算方法 ○平方根 a = M * 10E において、 ・a = 10 2・N の場合 10 * M = 1 で、E-1 が、0 か 2 の倍数であれば、Sqrt(a) = 0.1 * 10((E-1) \ 2)+1 とする。 ・a = 10 (2・N+1) の場合 E = 2 * Q + R と変換する。Q = E \ 2、 R = E Mod 2 である。すると、 a = M * 10R * 102・Q 従って、Sqrt(a) は、 Sqrt(M * 10R) * 10Q 実際には、1/Sqrt(a) なので、 1/(Sqrt(M * 10R) * 10Q) = 10-Q/(Sqrt(M * 10R) が求められる。R = 0 or 1 、M は、仮数部なので、結局、仮数部か仮数部の10倍の平方根の逆数を多段初期値法で求めることに帰着する。Q は指数部に加算すればよい。 多段初期値法については、逆数除算を参照方。 Sqrt(a) = (1/Sqrt(a)) * a なので、最後に一回乗算する。 ○立方根 a = M * 10E ・a = 10 3・N の場合 10 * M = 1 で、E-1 が、0 か 3 の倍数であれば、Sqrt(a) = 0.1 * 10((E-1) \ 3)+1 とする。 ・a = 10 (3・N+1) の場合 E = 3 * Q + R と変換する。Q = E \ 3、 R = E Mod 3 である。すると、 a = M * 10R * 103・Q 従って、Cbrt(a) は、 Cbrt(M * 10R) * 10Q 実際には、1/Cbrt(a) なので、 1/(Cbrt(M * 10R) * 10Q) = 10-Q/(Cbrt(M * 10R) が求められる。R = 0 or 1 or 2、M は、仮数部なので、結局、仮数部か仮数部の10倍/100倍の立方根の逆数を求めることに帰着する。Q は指数部に加算すればよい。
|