Причина в том, что биты, которые вы получаете от floatToIntBits
, представляют
- знак
- Показатель
- мантисса
выложено так:
Repr: Sign Exponent Mantissa
Bit: 31 30......23 22.....................0
Увеличение целого числа, хранящего эти поля на 1, не увеличит значение с плавающей запятой, которое оно представляет, на 1.
Я пытаюсь создать AtomicFloat через AtomicInteger, поэтому этот вопрос
Я сделал именно это в ответ на этот вопрос:
Чтобы добавить функциональность для увеличения числа на единицу, вы можете скопировать код incrementAndGet
с AtomicInteger
(и изменить с int
на float
):
public final float incrementAndGet() {
for (;;) {
float current = get();
float next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
(Обратите внимание, что если вы хотите увеличить число с плавающей запятой на наименьшее возможное значение , вы берете вышеуказанный код и меняете current + 1
на current +
Math.ulp(current)
.)