4

曲線の反射セグメント間の距離に関するいくつかの操作を実行する必要があるコード (Python) があります。

考え方とコードをより明確にするために、実際の計算を実行する前に (行列乗算を使用して) 2 つのローテーションを適用します。まったく回転せずに計算を実行することは可能だと思いますが、コードと考え方はもっとぎこちなくなります。

私が尋ねなければならないのは、浮動小数点の丸め誤差のために精度が失われるという点で、3 つのローテーションはペナルティが大きすぎるということですか? この誤差の大きさを推定する方法はありますか?

読んでくれてありがとう

4

2 に答える 2

5

数値計算の経験則として、最初の 12 桁だけを真剣に考えてください :)

ここで、3D 回転があり、三角関数の結果が無限に正確であると仮定すると、行列の乗算には、回転したベクトルの要素ごとに 3 つの乗算と 2 つの加算が含まれます。2 回の回転を行うため、要素ごとに 6 回の乗算と 4 回の加算になります。

これを読むと (これは、1 日で最初から最後まで読む必要があります)、またはthis、またはthisを読むと、IEEE 754 の個々の算術演算が ULP の半分 (= 小数点以下の最後の桁) の範囲内で正確であることが保証されていることがわかります。

問題に適用すると、結果ベクトルの要素ごとに 10 回の操作が 5 ULP 以内で正確になることを意味します。

つまり、単位ベクトルを回転させているとします。回転したベクトルの要素は 0.000000000000005 の精度になります。心配する必要はありません。

三角関数にエラーを含めると、もう少し複雑です...プログラミング言語やコンパイラのバージョンなどに大きく依存しますが、5つのULPに匹敵することは保証します。

この精度では不十分だと思われる場合は、一度に 2 つの回転を実行することをお勧めします。行列の乗算を解析的に計算し、回転を単一の行列の乗算として実装します。あるいは、クォータニオンを見てください(あなたの状況では少しやり過ぎだと思いますが)。

于 2012-08-14T07:15:52.680 に答える
1

あなたがしなければならないことは、操作の条件数を計算し、有意性が失われる可能性があるかどうかを判断することです。これにより、発生する可能性のあるエラーを推定できるはずです。

于 2012-08-13T22:51:48.967 に答える