紛らわしいreturnステートメント
-
03-07-2019 - |
質問
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を返します。
これは同等です
return (Math.abs(y) <= EPSILON);
わかりやすくするためにコードに追加する必要があります。前述のように、ブール値を返します。
代替案は
if (Math.abs(y) <= EPSILON)
return true;
else
return false;