web-dev-qa-db-ja.com

ゼロが正か負かを確認するにはどうすればよいですか?

floatが正のゼロ(0.0)か負のゼロ(-0.0)かを確認できますか?

floatStringに変換し、最初のchar'-'、しかし他の方法はありますか?

72
e4lime

はい、それで割ります。 1 / +0.0f+Infinity、 だが 1 / -0.0f-Infinity。単純な比較でどれが簡単にわかるので、次のようになります:

if (1 / x > 0)
    // +0 here
else
    // -0 here

(これは、xが2つのゼロのうちの1つにしかなれないことを前提としています)

79
harold

Float.floatToIntBitsを使用してintに変換し、ビットパターンを確認できます。

float f = -0.0f;

if (Float.floatToIntBits(f) == 0x80000000) {
    System.out.println("Negative zero");
}
37
Jesper

間違いなく最高のアプローチではありません。機能をチェックアウトする

Float.floatToRawIntBits(f);

独:

/**
 * Returns a representation of the specified floating-point value
 * according to the IEEE 754 floating-point "single format" bit
 * layout, preserving Not-a-Number (NaN) values.
 *
 * <p>Bit 31 (the bit that is selected by the mask
 * {@code 0x80000000}) represents the sign of the floating-point
 * number.
 ...
 public static native int floatToRawIntBits(float value);
12
andre baresel

Double.equals は、Javaで±0.0を区別します。 ( Float.equals 。)

私がこれまでに与えられたどの方法よりもはっきりしているように思えるので、誰もこれらに言及していないことに少し驚いています!

8
Reuben Thomas

Math.minで使用されるアプローチは、Jesperが提案しているものと似ていますが、少し明確です。

private static int negativeZeroFloatBits = Float.floatToRawIntBits(-0.0f);

float f = -0.0f;
boolean isNegativeZero = (Float.floatToRawIntBits(f) == negativeZeroFloatBits);
7
assylias

Floatが負の場合(-0.0および-infを含む)、負のintと同じ符号ビットを使用します。つまり、整数表現を0と比較でき、-0.0の整数表現を知ったり計算したりする必要がなくなります。

if(f == 0.0) {
  if(Float.floatToIntBits(f) < 0) {
    //negative zero
  } else {
    //positive zero
  }
}

それは受け入れられた答えの上に余分な分岐を持っていますが、私は16進定数なしでより読みやすいと思います。

目標が-0を負の数として扱うことだけであれば、外側のifステートメントを省くことができます。

if(Float.floatToIntBits(f) < 0) {
  //any negative float, including -0.0 and -inf
} else {
  //any non-negative float, including +0.0, +inf, and NaN
}
6
Kip

負の場合:

new Double(-0.0).equals(new Double(value));

正の場合:

new Double(0.0).equals(new Double(value));
0
Tridib