2013/07/11

pow(f, 2.0)よりf*f

C++。今更な話。

2次元で2点間のキョリを求めんのにさ。

sqrt(pow(ax-bx, 2.0) + pow(ay-by, 2.0));

みたいにやりたくなるやん?
でもこれが結構遅いんよね。
今までsqrtが遅いのだと思って、sqrtの直前に無理矢理固定小数点に変換してビット演算根性平方根にしてみたりしたけど、殆ど変わらないか寧ろ遅くなる。
キョリを比較するだけのときはsqrtせずに比較対象をpowしたりしてみたんだけど、イマイチ。
まあこれはこんなもんなんか・・・と思って諦めてたんだけど。

ところがなんとなしに
pow(ax-bx, 2.0)
(ax-bx)*(ax-bx)
に書き換えてみるとめっさ速くなった・・・。
こんなことで・・・今までの苦労が・・・。
調べてみるとpowってのは中でテイラー展開とかやってて、自乗するだけの為に使うにはすっげー高級過ぎみたいね。
てかテイラー展開って何?レッツWikipedia(→テイラー展開)。うーん・・・。
あ、因みに私数学で0点取ったことがあります。
あとgccで最適化コンパイルすると、なんとなくpow(f, 2.0)がf*fに最適化されてるような気がする。知らんけど。

序でにvector。
例えばvector <int>v;とかのとき。
要素にアクセスするのに、今までout_of_rangeのとき例外飛ばして欲しくて何でもかんでも
v.at(i)
とかしてたけど、
v[i]
のが大分速い。
out_of_rangeになる心配がほぼ無い場合はv[i]のがよさげ。
場合によってはiterator使った方がもうちょい速いっぽいけど、私が読み難くなるのでよっぽど速度が必要なところにのみ使う感じで。

まあそんな感じで。
今更知った話。