Побитовое поплавок

Я пытаюсь вычислить алгоритм, но все, что я получаю от Google, делает это с кастингом. Мне нужно знать подробности.

Итак, если у нас есть float x и мы хотим вернуть его двоичное представление, что нам нужно делать?

Я знаю, что нам нужно вернуть float, если его NaN или бесконечность, но в остальном, какие шаги?

РЕДАКТИРОВАТЬ

Функция принимает беззнаковый int, который будет использоваться, как если бы он был float, а затем возвращал целое число, которое представляет число. Я не могу использовать кастинг, просто условные и битовые операторы.

В качестве альтернативы используйте соединение:

 typedef union { float f_; int i_; } FloatBits; FloatBits fb; fb.f_ = 1.5; 

Затем fb.i_ содержит поплавок, сопоставленный с int чтобы разрешить извлечение бит. Опять же, обычные assunptions о размере типов – вы можете проверить их с помощью sizeof .

Используя этот подход, вы можете играть с настройкой битов в fb.i_ непосредственно и видеть, как они отображаются обратно в float .

Чтобы проверить, представляет ли 32-битное значение NaN, если оно было float, вы можете проверить, больше ли его значение без знака, чем представление для бесконечности.

 int n = if((n & 0x7FFFFFFF) > 0x7f800000) // is NaN 

Удаление знака требуется, так как NaN может иметь бит отрицательных знаков, установленный в 1 (хотя NaN не является положительным или отрицательным)


Если вы хотите узнать, является ли поплавок NAN, вы можете использовать

 float f = NAN if (f != f) // is NAN 

Для сравнения с Infinity

 float f = INFINITY; if (f == INFINITY) 

Номер float числа на языке программирования c соответствует стандарту IEEE для арифметики с плавающей точкой (IEEE 754) .

Вы можете преобразовать float в int с кодом

int i = *(int *)&f; // f is the float variable you want to convert

А затем интерпретируйте int соответствии со стандартом IEEE 754.