Няшная / Говнокод #24627 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
#include <stdio.h>
#include <inttypes.h> 

int main(void) {
	float a = 0;
	float b = -9.8 * 0;
	uint32_t* pa = (void*)&a;
	uint32_t* pb = (void*)&b;
	printf("%li %li %i %f %f\n",pa[0] , pb[0], pb[0]>>31, b+0, b);
	return 0;
}

Нолик со взведенным знаковым битом. Вот зачем он нужен?

Запостил: Psionic Psionic, (Updated )

Комментарии (3) RSS

  • По стандарту IEEE-754 число с плавающей точкой состоит из бита знака, порядка и мантиссы, и, не вдаваясь в подробности фактического их представления, результирующее число вычисляется по формуле x = s * m * 2^e, где s - знак (-1 или +1), m - мантисса, e - порядок. Плавающий питух хранится в нормализованной форме: точка в мантиссе стоит после первой ненулевой цифры (0.9 - хуета, 90.0 - хуета, 9.0 - заебись). Но поскольку плавающий питух у нас двоичный, первая цифра всегда* будет равна 1, а потому она просто отбрасывается - и в результате получаем 24 бита мантиссы (для 32-битного питуха) вместо 23 — и это хорошо.
    *Но с этой оптимизацией мы не можем хранить нулевую мантиссу (поскольку считаем, что целая единица есть всегда) - и, соответственно, у нас нет полноценного нуля. Поэтому в стандартном плавающем питухе считается, что если у числа и мантисса, и порядок равны нулю (т.е. все их биты нулевые, там ещё заморочки с представлением отрицательного порядка), то и само число равно нулю (хотя фактически, без этой оговорки, для 32-битного питуха это будет 1.0*2^-127). Из-за этого и получается, что плавающих нулей два — +0 и -0: бит знака-то никак не влияет на модуль числа, как это, к примеру, происходит в two's complement.
    Мы, конечно, можем доопределить один из них под какое-то другое число, но это приведёт только к лишнему и бессмысленному усложнению схем FPU.
    Читать подробнее: http://steve.hollasch.net/cgindex/coding/ieeefloat.html
    Ответить
    • Порядок, кстати, хранится со сдвигом. Именно поэтому нолики в порядке у 32-битного float трактуются как -127, нолики в порядке у 64-битного double трактуются как -1023, нолики в порядке у 80-битного или 128-битного long double (extended) трактуются как -16383. Т. е. чтобы получить множитель 1 = 2^0, нужно в порядок запихнуть соответственно 127, 1023 и 16383 для float, double, long double.

      Есть ещё денормализованный плавающий питух, предназначенный для хранения очень маленьких (по модулю) чисел. Если порядок забит ноликами, то ведущая единица не подразумевается (кстати, 0 и -0 — это частные случаи денормализованного питуха).
      Ответить

Добавить комментарий

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8