1. Си / Говнокод #24627

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 16 Августа 2018

    Комментарии (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
      Ответить

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