タグ

Cとmathに関するrydotのブックマーク (2)

  • 数値演算のアルゴリズム

    3Dの計算処理では、「正確性よりも速度を求める」という場合がよくあります(特にリアルタイム)。 そのあたりで使えそうな、数値演算のアルゴリズムをまとめてみました。 sqrt:平方根を求める C言語では"math.h"の「sqrt」で平方根を計算します。 これと同等の機能をするプログラムは以下のようになります。 浮動小数点での平方根の計算 double mySqrt(double x) { double s,last; if(x<=0.0) return 0.0; if (x > 1) s = x; else s = 1; do { last = s; s = (x / s + s) * 0.5; } while (s < last); return last; } 整数での平方根の計算 int myISqrt(int x) { int s, t; if (x <= 0) return 0;

  • 平方根を使わないピタゴラス加算 | Codelogy

    二次元座標上の2点間の距離を求めたいとき、複素数の絶対値を求めたいとき、その他いろいろなときに x = √(a2 + b2) という式を使います(これをpythagorean additionと言うそうです)。これを実装するとき、 という文がよく使われますが、この文を無闇に使っていると、あまり嬉しくない事態を引き起こすことになります。 さて、この文ののどこがいけないのでしょうか。 賢明な皆さまはもうお気づきでしょうが、a*a + b*bはオーバーフローを引き起こすおそれがあるのです。変数の値域を保証できるのならともかく、そうでなければ次に挙げる3つの対策のいずれかを採るべきです。 1.式変形 a’ = max( |a|, |b| ), b’ = min( |a|, |b| ) とおくと、 √(a2 + b2) = a’√(1 + (b’/a’)2) と変形できます。この式を使うとオ

  • 1