質問

IFステートメントの動作を正確に理解できていません。変数xがint 0と等しいかどうかを確認していることがわかります。これがtrueの場合、変数yのABSOLUTE値が返されます...これがプロットを失ったとき、なぜreturnステートメントが<= ESPILONを含むのですか?確かに、これはイプシロンの値以下を意味しますか?もしそうなら、それはどのように機能していますか?それがそれを意味しない場合、それはどういう意味ですか?

(JAVAコード)

final double EPSILON = 1E-14;
if (x == 0)
    return Math.abs(y) <= EPSILON;
役に立ちましたか?

解決

浮動小数点演算は本質的に不正確であるため、同等性をテストするのではなく(常に悪い考えです)、代わりに開発者は許容範囲として小さな数値(この場合は1x10 ^ -14)を選択しましたゼロに近い。 returnステートメントは比較を返すので、これはyの絶対値を取得し、ゼロに十分に近い場合にのみtrueを返します。十分に近い場合はEPSILONによって定義されます。

他のヒント

yの絶対値が<!> lt; = EPSILONの場合はtrueを返し、それ以外の場合はfalseを返します。 <!> lt; =は、returnステートメントの前に評価されます。このコードは同等です:

if(x == 0)
{
   boolean ret = Math.abs(y) <= EPSILON;
   return ret;
}

コードは、単に左から右に読むだけではありません。より簡単な例は

です
int x = 3 + 4 * 5;

これを評価した後、xは35ではなく23です。*は+よりも優先順位が高いため、評価は(3 + 4)* 5ではなく3 +(4 * 5)です。元の例のreturnステートメントの優先順位は非常に低くなっています。 +、-、<!> lt;、<!> gt; =などのすべての演算子は、その前に評価されます。

式全体

Math.abs(y) <= EPSILON

最初に評価する必要があります。つまり、関数はブール値(true / false)を返します。そうは言っても、

x != 0

その後、何が返されるかわかりません。

変数xが(まあ、おそらくint)0に等しいかどうかをチェックしているのは正しいです。しかし、これが真の場合、yの絶対値を返さず、ブール値<!> lt; =演算子の結果。

ブール値を返します。

Epsilonは値1E-14を保持するdoubleです。

これは実際のIFステートメントです

if (x==0) {
    return MATH.abs(y) <= EPSILON;
}

したがって、返されるのは、yの絶対値がEpsilon以下の場合です。

私は長い間Javaを実行していませんが、これは実際にブール値(暗黙的にキャストされる可能性があります)を返しているようです。

xが0に等しい場合、yの絶対値が<!> lt; = Epsilonの場合はtrueを返し、そうでない場合はfalseを返します。

ただし、xが0に等しくない場合は、elseをカバーするステートメントがないため、nullを返します。

<!> quot; issue <!> quot;このフラグメントは、演算子の優先度に大きく依存しているということです(それ自体は悪くはありませんが、時には混乱を招く可能性があります)。

ここのリストをご覧くださいすべてのjava演算子とその優先順位、およびここでC / C ++の同じ表を比較

これは同等です

return (Math.abs(y) <= EPSILON);

わかりやすくするためにコードに追加する必要があります。前述のように、ブール値を返します。

代替案は

if (Math.abs(y) <= EPSILON)
    return true;
else
    return false;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top