4

内積が 0 に近いかどうかを確認するとき、イプシロンはどのくらいの大きさにすべきですか?

私はレイトレーシング プロジェクトに取り組んでおり、内積が 0 かどうかを確認する必要があります。しかし、epsの大きさがどれくらいかわかりませんか?

ありがとう

4

2 に答える 2

1

これをレイ トレーシング プロジェクトの一部として説明しているため、必要な精度は、シーンの「ワールド座標」、またはそれらが変換される画面座標によって決まる可能性があります。これらのいずれも、計算における絶対誤差の許容可能な目標を示します。

それから、「理論的に」ゼロであると想定される内積を形成するなど、実行中の中間計算で必要な精度に戻ることができる場合があります。たとえば、2 つの滑らかな物体間の最短経路 (反射光) を見つけようとしていて、内積 (垂直性) の消失によって点の位置が得られるとします。

そのような場合、内積は求める未知数 (点の位置) の 2 次である可能性があります。未知数が「二重根」(多重度 2 のゼロ) を形成し、その根の位置がゼロである内積の計算に非常に敏感になる可能性があります。

このような場合、位置の精度に必要な内積の桁数「ゼロ」の約 2 倍を取得する必要があります。基本的に内積は、二重根の近くの位置で非常にゆっくりと変化します。

しかし、あなたのアプリケーションはそれほど機密ではないかもしれません。適切な答えを得るには、関連するアルゴリズムの分析が必要です。原則として、内積を倍精度で実行して、単精度の限り信頼できる答えを取得しますが、レイ トレーシングをリアルタイムで実行する場合、これはコストがかかりすぎる可能性があります。

于 2012-11-18T14:38:11.770 に答える
1

決定的な答えはありません。私は2つのアプローチを使用します。

浮動小数点エラーのみが問題になる場合は、コンパイラが処理できる最小の浮動小数点数に匹敵する、かなり小さい値を使用できます。c/c++ では、これらの数値をチェックするfloat.hなど、 で提供されている定義を使用できます。たとえば、の値として、数値DBL_MINの小さな倍数を使用します。10. * DBL_MINeps

問題が浮動小数点演算の丸め誤差でない場合は、最小ベクトルのモジュラスに比べて小さい値 (たとえば 1%) を使用します。

于 2012-11-18T11:09:03.293 に答える