1

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

(ジャバコード)

final double EPSILON = 1E-14;
if (x == 0)
    return Math.abs(y) <= EPSILON;
4

8 に答える 8

12

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

于 2008-10-03T00:17:44.183 に答える
5

y の絶対値が <= EPSILON の場合は true を返し、それ以外の場合は false を返します。<= は、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 ステートメントの優先順位は非常に低くなっています。+、-、<、>= などのすべての演算子は、その前に評価されます。

于 2008-10-03T00:16:23.737 に答える
5

表情全体

Math.abs(y) <= EPSILON

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

x != 0

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

于 2008-10-03T00:17:36.540 に答える
1

変数 x が (たぶん int) 0 に等しいかどうかをチェックしているのはあなたの言う通りです。ただし、これが true の場合、y の絶対値を返すのではなく、ブール値を返します。 <= 演算子。

于 2008-10-03T00:16:54.310 に答える
1

ブール値を返しています。

Epsilon は double で、値 1E-14 を保持します。

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

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

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

于 2008-10-03T00:17:24.887 に答える
0

「問題」は、このフラグメントが演算子の優先順位に大きく依存していることです(それ自体は悪くありませんが、混乱する場合があります)。

ここに、すべてのJava演算子とその優先順位のリストがあり比較のために、C /C++の同じ表があります。

于 2008-10-03T09:19:48.410 に答える
0

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

x が 0 の場合、y の絶対値 <= Epsilon の場合は true を返し、それ以外の場合は false を返します。

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

于 2008-10-03T00:18:38.440 に答える
0

これに相当します

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

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

代替案は

if (Math.abs(y) <= EPSILON)
    return true;
else
    return false;
于 2008-10-03T13:23:17.287 に答える