Чи можна перевірити, чи a float
є позитивним нулем (0,0) чи негативним нулем (-0,0)?
Я перетворив float
a на String
і перевірив, чи є перший char
a '-'
, але чи існують інші способи?
Чи можна перевірити, чи a float
є позитивним нулем (0,0) чи негативним нулем (-0,0)?
Я перетворив float
a на String
і перевірив, чи є перший char
a '-'
, але чи існують інші способи?
Відповіді:
Так, розділіть на це. 1 / +0.0f
є +Infinity
, але 1 / -0.0f
є -Infinity
. Легко дізнатися, який це, за допомогою простого порівняння, ви отримаєте:
if (1 / x > 0)
// +0 here
else
// -0 here
(це передбачає, що це x
може бути лише один із двох нулів)
if (math.copySign (1.0, x) < 0.0) ...
math.copySign(1.0,x)<0.0
це "простіше", ніж 1/x>0
. Я маю на увазі, що обидва цілком не зрозумілі, тому ви все одно хочете мати для цього функцію
Ви можете скористатися Float.floatToIntBits
для перетворення його у формат an int
і розглянути бітову схему:
float f = -0.0f;
if (Float.floatToIntBits(f) == 0x80000000) {
System.out.println("Negative zero");
}
(Float.floatToIntBits(f) & 0x80000000) < 0
Безумовно, не найкращий підхід. Оформити функцію
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
відрізняє ± 0,0 на Java. (Є також Float.equals
.)
Я трохи здивований, що про них ніхто не згадував, оскільки вони здаються мені зрозумілішими за будь-який із методів, наведених дотепер!
Коли плаваючий знак від’ємний (включаючи -0.0
та -inf
), він використовує той самий розрядний біт, що і мінус int. Це означає, що ви можете порівняти цілочисельне представлення 0
, усуваючи необхідність знати або обчислювати цілочисельне представлення -0.0
:
if(f == 0.0) {
if(Float.floatToIntBits(f) < 0) {
//negative zero
} else {
//positive zero
}
}
Це має додаткову гілку над прийнятою відповіддю, але я думаю, що це читабельніше без шістнадцяткової константи.
Якщо ваша мета - просто розглядати -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
}