[C] ベキ乗計算は遅い!

なるべく使わないようにしましょう。

例えばC言語でx^2をpow(x, 2)関数で計算するとしましょう。これは当然x*xと同じ答えが帰ってくるはずです。では速度としてはどちらが早く計算をしてくれるのでしょうか。

答えは簡単です。以前sincos関数を使用した時と同様の原理で、powという数学関数を呼び出すことでそれがタイムロスに繋がるのです。さらに言うなれば、この数学関数の大半はテイラー展開による高精度近似値を求めて、その値を返します。このテイラー展開に時間が取られてしまうのです。同じくFortranのx**2もx*xより遅くなります。

下に今回のコードと、timeコマンドによる実行時間の比較を示します。

 

 

for文でベキ乗計算を1千万回行うというものです。

time実行時間比較

pow使用: 0.150

pow使用なし: 0.042

さすがに一千万回も繰り返すとこれだけ差が出てきます。

 

結論、powはなるべく使わない。ただし、プログラムの見易さを考慮すれば4乗以上はpowでも良いというのが、個人的な感想です。

 

参考文献: チューニング技法入門 (http://accc.riken.jp/supercom/traning/textbook/)

2 thoughts on “[C] ベキ乗計算は遅い!

  1. 整数べきは繰り返し二乗法を使うといいと思います。
    //a^nを計算
    long pow(long a,long n){
    long ret=1;
    for(;n>0;n>>=1,a=a*a){
    if(n%2==1)ret=ret*a
    }
    return ret;
    }

    1. そんな方法があったとは存じ上げませんでした。繰り返し二乗法というのは初耳です、自分でも調べて見たいと思います!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Captcha loading...