4

いくつかのレイテンシ測定テストの後、かなり遅い FPU を搭載した組み込み CPU で実行されるピタゴラスの三角形の計算を最適化する必要があることがわかりました。

問題は、これらの計算が発生した場合、それらが数値になり、タイミングが台無しになることです。計算の絶対数を減らすことはできません。しかし、どういうわけか、それらはより速くなる必要があります...少なくとも5倍。:-/

個別の値の入力範囲が何らかの形で約 300 ~ 500 の順列に制限されており、2 つのテーブル エントリ間の補間で十分であるため、現在、これらの計算を前処理することを考えています。しかし、問題にいくつかの条件を使用すると、このコードも高速化できるのではないかと考えていました。

float h = 0.f, v=0.f;
/// ...
float const d = std::sqrt( (h*h) + (v*v) );

これはまだ使用していません:

  1. 結果dの精度は、小数点以下 3 桁が必要なため、非常に制限されます。
  2. 三角形の脚 (h,v) は常に 4:3 または 16:9 の縦横比です。

整数の固定小数点計算が平方根で利用できるかどうか、または関数を精度の低いものに置き換えることができるかどうか、または何らかの方法でアスペクト比を使用できるかどうかはわかりません。

何か案は?

ありがとうございました!

4

2 に答える 2

6

比率が 16:9 であることがわかっている場合は、少し代数を実行できます。

h = 16*x
v = 9*x
x = h/16
sqrt((h*h) + (v*v)) = sqrt((16*16*x*x) + (9*9*x*x))
                    = sqrt((16*16+9*9)*x*x)
                    = sqrt(16*16+9*9)*x
                    = sqrt(16*16+9*9)*h/16
                    = sqrt(16*16+9*9)/16 * h

事前計算sqrt(16*16+9*9)/16:

static float const multiplier = std::sqrt(16*16+9*9)/16.0;

と使用

float const d = multiplier*h;
于 2013-08-09T13:32:08.157 に答える