float
が正のゼロ(0.0)か負のゼロ(-0.0)かを確認できますか?
float
をString
に変換し、最初のchar
が'-'
、しかし他の方法はありますか?
はい、それで割ります。 1 / +0.0f
は+Infinity
、 だが 1 / -0.0f
は-Infinity
。単純な比較でどれが簡単にわかるので、次のようになります:
if (1 / x > 0)
// +0 here
else
// -0 here
(これは、x
が2つのゼロのうちの1つにしかなれないことを前提としています)
Float.floatToIntBits
を使用してint
に変換し、ビットパターンを確認できます。
float f = -0.0f;
if (Float.floatToIntBits(f) == 0x80000000) {
System.out.println("Negative zero");
}
間違いなく最高のアプローチではありません。機能をチェックアウトする
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);
Double.equals
は、Javaで±0.0を区別します。 ( Float.equals
。)
私がこれまでに与えられたどの方法よりもはっきりしているように思えるので、誰もこれらに言及していないことに少し驚いています!
Math.min
で使用されるアプローチは、Jesperが提案しているものと似ていますが、少し明確です。
private static int negativeZeroFloatBits = Float.floatToRawIntBits(-0.0f);
float f = -0.0f;
boolean isNegativeZero = (Float.floatToRawIntBits(f) == negativeZeroFloatBits);
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
}
負の場合:
new Double(-0.0).equals(new Double(value));
正の場合:
new Double(0.0).equals(new Double(value));