logとpowの計算
10のn乗をexp関数を作って自前で書いている話を書きましたが、ついでに、logとxのy乗についても書きたいと思います。昨日のブログで下記の話をしました。
Z=pow(10,n)は、
log(Z)=log( pow(10,n) )
log(Z)=n*log(10) となり、
ここで、
Y=log(X)は、X=exp(Y)なので
Z=exp(n*log(10)) である。
すなわち、10のところがxになったとすると、log(x)が解ければ、xのy乗が計算できます。
logをテイラー展開して求めるプログラムを書きに示します。
//********************************************** // log( x )計算のサブルーチン //********************************************** double sublog( double z ) { double y; double b, k; int n; if( z==2.0 ){ return( 0.6931471805599449 ); } y = ( z - 1 ); b = y; n = 2; while( true ){ b = b * ( z - 1 ); k = b / (double)n; if( -0.0000001<k && k<0.0000001 ) break; if( (n % 2)==0 ){ y = y - k; } else{ y = y + k; } n++; } return( y ); } //********************************************** // log( x )を計算する //********************************************** double tlog( double x ) { double y = 0.0; double d, e, c; if( x==2 ){ return( 0.6931471805599449 ); } else if( x<2 ){ y = sublog( x ); } else{ c = 1.0; d = 1.0; while( true ){ d *= 2.0; e = x / d; if( e<=2.0 ) break; c++; } y = c * 0.6931471805599449 + sublog( e ); } return( y ); }
これで、
Z = pow(x,y)の計算が、
Z = exp( y*log(x) ) として解くことができるようになりました。
本当にやりたいことリスト
(ブログの終わりにやりたいことを書いておきたいと思います)
- 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
- Androidプログラム
- Web系のプログラム