9

次のコード スニペットがあります。

if (ABS(p43.x)  < EPS && ABS(p43.y)  < EPS && ABS(p43.z)  < EPS) return(FALSE);

私はC#に変換しようとしています。"EPS" とはどういう意味ですか?

このコードはhttp://local.wasp.uwa.edu.au/~pbourke/geometry/lineline3d/からのものです

4

7 に答える 7

22

数値が「重要ではないほど小さい」かどうかを判断するのは、何らかの形のイプシロンになります。この場合、正確な値は#defineどこかにあるようです。

于 2009-03-09T16:14:28.950 に答える
9

EPSはイプシロンです。「十分に近い」要因。

問題は、「絶対値は十分に近いか?」ということです。「十分に近い」とは小さな数で、多くの場合 のようなもの1.0E-3です。

アルゴリズムがどのように答えに収束するかによって、パフォーマンスは EPS のサイズに依存する場合があります。プロセスが数時間 (または数百年) 実行され、実際に使用可能な答えが得られない可能性があるため、EPS を小さくしすぎないように注意してください。

この場合 (ループがない場合)、EPS が使用されます。これは、浮動小数点数が乗算中に小さなエラーを蓄積するためです。簡単に言うことはできません

a == b

そして、それが一般的に真実であること。代わりに、私たちはいつも言います

abs( a-b ) <= EPS
于 2009-03-09T16:17:12.657 に答える
2

ジョン・スキートが正しいと思います。そのページのLispコードを見ると、次のように定義されている「nearzero」と呼ばれる計算で同様の参照が見つかります。

(setq nearzero 0.00001)

このことから、EPS は 0.00001 に設定された定数であると言えます。

于 2009-03-09T16:21:06.500 に答える
1

イプシロン...おそらく#defineになるでしょう...

イプシロンは通常、float または double 精度の範囲内でゼロに非常に近い数値を示すために使用されます。

p43.x の値が、ゼロとして数えられるほど十分にゼロに近いかどうかを判断するために使用されます。

于 2009-03-09T16:16:05.887 に答える
1

EPS は Epsilon 用であると言えます。

数学 (特に微積分) における、任意の (またはそれに近い) 小さい正の量。

あなたの例では、(ABS(p43.x)の結果が十分に小さい(ゼロに近い)かどうかを判断するために使用されます。

于 2009-03-09T16:16:16.980 に答える
1

ほとんどの場合、p43浮動小数点値を保持する構造体です。浮動小数点値の精度は有限であるため、実数のサブセットしか表すことができません。つまり、丸め誤差のマージンを考慮して等価性をチェックする必要があることがよくあります。

チェックする代わりにx = 0、コードはチェックします|x| < EPS。つまり、 のすべての値は]-EPS, +EPS[十分小さいと見なされます0

マシン epsilonで読むことも検討してください。

于 2009-03-09T16:19:40.950 に答える
1

C および C++ では、プリプロセッサ定数 FLT_EPSILON および DBL_EPSILON があります。これらは、それぞれ浮動小数点および倍精度で 1 + {FLT,DBL}_EPSILON > 1 となる最小の数値です。この EPS は、同様のアプリケーション固有の「ゼロに近い」値のようです。

于 2009-03-09T17:00:47.760 に答える