3

傾きの計算精度を上げる方法があれば教えてください。(これはここ数ヶ月前に出てきました)。

それは変更することによって思われます:

float get_slope(float dXa, float dXb, float dYa, float dYb) {
    return (dXa - dXb)/(dYa - dYb);
}

float get_slope(float dXa, float dXb, float dYa, float dYb) {
    return  dXa/(dYa - dYb) - dXb/(dYa - dYb);
}

改善かもしれません。提案?

編集:私が求めているのは精度であり、効率ではありません。

4

3 に答える 3

5

関数内でdoubleにキャストします。


問題が発生するのは、明らかに分母がゼロに近いときです。あなたの傾きは無限大に近づきます。そのため、スロープで何をしたいかによって大きく異なります。場合によっては、デルタ y がゼロに近くなることがわかっている場合は、勾配の逆数を計算して、代わりにそれを使用できます。deltax と deltay の絶対値のどちらが小さいかを検出して、勾配または 1/勾配を返すこともできます。atan2() も調べてください。


入力が 10 進数であることがわかっていて、出力も 10 進数で表示したい場合は、10 進数ライブラリを使用してすべての計算を行うことで、浮動小数点数を 2 進数に変換したり戻したりする際に生じる精度の低下を克服できます。6502のBCDモードを使ったAtari BASICで10進数の計算をしたときはうれしかったのを覚えています。

于 2009-05-27T19:23:24.773 に答える
1

いくつかの余分なサイクルを焼いても構わない場合は、ループを実行することで精度を高めることができます。

A と B の間の線分の傾きを計算します。

{(Xa - (Xa -Xb)), (Ya -(Ya -Yb)} と {(Xb + (Xa - Xb)), (Yb +(Ya - Yb))} の間の線分の傾きを計算します。 ..基本的にはA-スロープとB+スロープです。

次に、結果の勾配を比較します。差が大きすぎる場合 (必要なしきい値を選択)、続行して、最後にすべての勾配を平均します。

これは、非常に小さな勾配の浮動小数点演算によって引き起こされる異常を滑らかにするのに役立ちます。

于 2009-05-27T19:44:00.507 に答える
1

タイプミスがあると思います。あなたはおそらく意味します

return  dXa/(dYa - dYb) - dXb/(dYa - dYb);

あなたが与えた最初のフォームの方が精度が高いと思います。dXa と dXb が近くて大きい場合、減算する前に 2 つの除算で精度が失われます。

于 2009-05-27T19:00:48.610 に答える