написать функцию, которая проверяет, является ли заданное вещественное число формата float числом, меньшим по абсолютной величине единицы

Написать функцию, которая проверяет, является ли заданное вещественное число формата float числом, меньшим по абсолютной величине единицы. Функция не должна использовать операции сравнения вещественных чисел, вместо этого используйте операции с битами и целыми числами, а также функции, превращающие вещественное число в битовое представление в виде целого - Float.floatToIntBits().

сначала написал так:

public static void main(String[] args) {

    System.out.println(lessThenOne (-0.314f));
}

public static boolean lessThenOne(float number) {
    boolean lessThanOne = ((byte) number == 0);
    return lessThanOne;
}

но приведение вещественного к целому с помощью (byte), во-первых, включает в себя запрещенные для этого задания операции с вещественными, а во-вторых, не всегда будет давать корректный результат для больших значений аргумента, как мне написать с функцией Float.floatToIntBits()?


Ответы (1 шт):

Автор решения: MBo

Если изучить формат представления вещественных чисел IEEE 754, то легко заметить, что меньше единицы по модулю те числа, 8 битов которых (с 23 по 31) образуют число меньше 127.

Почему так? Числа в формате знак * 1.мантисса * 2^порядок, где порядок хранится в байте, значение которого смещёно на 127. Таким образом, для чисел от единицы и выше (в т.ч. +-Infinity) порядок будет 127 и более, а для чисел менее единицы (в т.ч. денормализованных) 0..126

Вот пример на Delphi. Сдвиг вправо, наложение маски для удаления знака.

var
  i: Int32;
  f: Single;
begin
  f := 0.99;
  i := PInteger(@f)^;
  if ((i shr 23) and $FF) < 127 then
    Memo1.Lines.Add('less');

Раз у Вас в Java есть функция получения целочисленного представления внутреннего содержания float, то выделить нужные биты не составит труда.
Проверим на Ideone

float f = -0.99f;
int ii = Float.floatToIntBits(f);
System.out.println(((ii >> 23) & 0xFF) < 127); 
→ Ссылка