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

    +118

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    void dwflt_to_str(DWORD dw, char *pch, int &nsmb)
    {
      DWORD dw_a = dw;
      char ch_a;
      char tbldec[] = "0123456789";
      nsmb = 0;
      if (dw_a == 0) { pch[0] = '0'; nsmb++; goto lab2; }
      while (dw_a != 0)
      {
        pch[nsmb] = tbldec[dw_a%10]; dw_a /= 10; nsmb++;
      }
      dw_a = nsmb/2;
      while (dw_a)
      {
        ch_a = pch[nsmb - dw_a]; pch[nsmb - dw_a] = pch[dw_a - 1]; pch[dw_a - 1] = ch_a; dw_a--;
      }
    lab2:
      pch[nsmb] = 0;
    }
    
    const int n_fr2 = 7; // - эта константа определяет фиксированное число цифр после точки в выводимой строке, представляющей float.
    
    void float_to_str(float flt, char *pchar, int &nsmb)
    {
      int i, deg, ns_int, ns_frac;
      double frac_dbl;
      DWORD dw_f, mant, intg, fract;
      DW_FL f_flt;
      char szfl_int[16], szfl_frac[16];
      f_flt.fl = flt;
      dw_f = f_flt.dw;
      if (dw_f == 0) { pchar[0] = '0'; pchar[1] = '.'; pchar[2] = '0'; pchar[3] = 0; nsmb = 3; return; }
      if (dw_f & 0x80000000) { pchar[0] = '-'; } else { pchar[0] = '+'; }
      deg = int((dw_f & 0x7F800000) >> 23) - 127;
      mant = (dw_f & 0x007FFFFF) | 0x00800000;
      if (deg == 0) { intg = 1; fract = dw_f & 0x007FFFFF; goto lab_1; }
      if (deg > 0) { intg = mant >> (23 - deg); fract = ((dw_f & 0x007FFFFF) << deg) & 0x007FFFFF; goto lab_1; }
      if (deg < 0) { intg = 0; fract = ((dw_f & 0x007FFFFF) | 0x00800000) >> (-deg); }
    lab_1:
      frac_dbl = double(fract)*1.1920928955078125;// 1.1920928955078125 = 10^n_fr2 / 2^23 = 10^7 / 2^23
      fract = (int)frac_dbl;
    
      dwflt_to_str(intg, szfl_int, ns_int);
      nsmb = 1; i = ns_int; while (i) { pchar[i + 1] = szfl_int[i]; i--; } pchar[1] = szfl_int[0];
      nsmb += ns_int; pchar[nsmb] = '.'; nsmb++;
    
      dwflt_to_str(fract, szfl_frac, ns_frac); szfl_frac[n_fr2] = 0;
      i = ns_frac; while (i) { szfl_frac[6 - ns_frac + i] = szfl_frac[i - 1]; i--; }
      i = n_fr2 - ns_frac; while (i) { szfl_frac[i - 1] = '0'; i--; }
    
      i = n_fr2 - 1; while (i) { pchar[nsmb + i] = szfl_frac[i]; i--; } pchar[nsmb] = szfl_frac[0];
      nsmb += n_fr2; pchar[nsmb] = 0;
    }
    void float_to_str_exp(float flt, char *pchar, int &nsmb)
    {
      int i, deg, poli, ns_int, ns_frac, ns_poli;
      double frac_dbl;
      DWORD dw_f, mant, intg, fract;
      DW_FL f_flt;
      char szfl_int[16], szfl_frac[16];
      f_flt.fl = flt;
      dw_f = f_flt.dw;
      if (dw_f == 0) { pchar[0] = '0'; pchar[1] = '.'; pchar[2] = '0'; pchar[3] = 0; nsmb = 3; return; }
      if (dw_f & 0x80000000) { pchar[0] = '-'; } else { pchar[0] = '+'; }
      deg = int((dw_f & 0x7F800000) >> 23) - 127;
      mant = (dw_f & 0x007FFFFF) | 0x00800000;
      if (deg == 0) { intg = 1; fract = dw_f & 0x007FFFFF; goto lab_1; }
      if (deg > 0) { intg = mant >> (23 - deg); fract = ((dw_f & 0x007FFFFF) << deg) & 0x007FFFFF; goto lab_1; }
      if (deg < 0) { intg = 0; fract = ((dw_f & 0x007FFFFF) | 0x00800000) >> (-deg); }
    lab_1:
      frac_dbl = double(fract)*1.1920928955078125;// 1.1920928955078125 = 10^n_fr2 / 2^23 = 10^7 / 2^23
      fract = (int)frac_dbl;
    
      dwflt_to_str(intg, szfl_int, ns_int);
      dwflt_to_str(fract, szfl_frac, ns_frac); szfl_frac[n_fr2] = 0;
      if (intg != 0)
      {
        nsmb = 1; i = ns_int; while (i) { pchar[i + 2] = szfl_int[i]; i--; } pchar[1] = szfl_int[0];
        pchar[2] = '.'; nsmb += ns_int + 1; poli = ns_int - 1;
      }
      else
      {
        i = ns_frac - 1; while (i) { pchar[2 + i] = szfl_frac[i]; i--; } pchar[1] = szfl_frac[0];
        pchar[2] = '.'; nsmb = 3;//nsmb += ns_frac + 1;
        poli = ns_frac - n_fr2 - 1; goto lab_2;
      }
    
      i = ns_frac; while (i) { szfl_frac[6 - ns_frac + i] = szfl_frac[i - 1]; i--; }
      i = n_fr2 - ns_frac; while (i) { szfl_frac[i - 1] = '0'; i--; }
    
      i = n_fr2 - 1; while (i) { pchar[nsmb + i] = szfl_frac[i]; i--; } pchar[nsmb] = szfl_frac[0];
    lab_2:
      nsmb += n_fr2; pchar[nsmb] = 'E';
    
      int_to_str(poli, &pchar[nsmb + 1], ns_poli);
      nsmb += ns_poli + 1; pchar[nsmb] = 0;
    }

    оттуда

    Запостил: TarasB, 15 Января 2013

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

    • Ты меня обогнал. :(
      Ответить
    • Любитель извращений в наименованиях во мне ликует.
      Ответить
    • Феерический пиздец! Надо будет вечером найти время, разобраться в работе этого кода.
      Ответить
      • Какие необычные однако у вас способы проведения досуга.
        Ответить
      • А этот код быстрее буст.кармы и лексикал_каст, не говоря уж о стандартных средствах С++
        Ответить
    • void float_to_str(float flt, char *pchar, int &nsmb)
      {
          nsmb = sprintf(pchar, "%f", flt);
      }


      Fixed?
      Ответить
      • Всяко медленнее, да еще и уязвимость осталась, позволяющая специально сформированным числом (достаточно большим или маленьким) переполнить буфер и распидорасить прогу (%f не переключается в экспоненциальный режим, и вываливает стозначные числа как стозначные числа).
        Ответить
      • %f не поможет, если компилятор сделан по стандарту то он должен обрезать на 7 символе после запятой
        но строку ведь можно переполнить и сверху (целая часть), например 40 разрядным числом.
        Ответить
    • эта сишкомагия... она прекрасна!
      Ответить
      • сишка - это магия
        Ответить
      • причем здесь си вообще, это же вопросы представления числа с плавающей точкой в памяти.
        что-то из этой оперы было у Кармака из id software.
        Ответить
        • Это рождение нового Кармака.
          В наше время молодежь Кармака не знает. А ведь это герой ГДсру
          Ответить
        • Быстрый обратный квадратный корень?
          Ответить
        • Так сказал, почти как
          > что-то из этой оперы было у одного чувака по фамилии Кармак, его никто не знает, но он в id software работал
          Ответить
          • Кто такой Кармак? Что-то ни разу не слышал про него.
            Ответить
            • Что за id software? это которая ворд сделала?
              Ответить
              • Да нет, тут что-то про id, а id это идентификаторы... видимо они фейсбук запилили.
                Ответить
              • >ворд
                эксель!!!
                http://www.youtube.com/watch?v=nwg9eLHZZRo
                Ай-ай-ай. Совсем не знают классики. Чего ж ты excel не написал. Тонко получилось бы.
                Ответить
                • А ведь хотел...
                  Ответить
                • Не, эксель - это пидарас один написал
                  Ответить
                  • Ну тебе это не помешало его процитировать - сослаться на авторитетное мнение пидораса.
                    Ответить
                    • Ну пока что не найдено отрицательной корреляции между педарастичностью и авторитетностью.
                      Положительной в точных науках тоже, правда, не обнаружено, в отличие от искусства.
                      Ответить
                      • > в отличие от искусства
                        Ты про эплоёбов? Комент сейчас уйдет в минуса.
                        Знаешь что я тебе скажу? Купил я значит макбук. Там стоит какой то урезанный по самое немогу линус. Я за линус заплатил бабки! Я долбаёб! Настраивать под себя ничего нельзя. Там какаято долбонутая белая тема окошек и тоже не меняется. И они сказали, что это для людей искуства и дизайнеров. Вот пидорасы! Менять конфиги нельзя, так как я тогда нарушу лицензию. Кто додумался по нажатию Энтера переименовывать файл? Почти за все программы из менеджера пакетов нужно платить. Вообщем у меня батхерт. Ждите новых стори. Хотя не ждите. Снесу и поставлю Линус.
                        Ответить
                        • > Я долбаёб!
                          Угу. Надо было в магазине попросить включить и немного поиграться с ним. Ну и почитать отзывы и описания перед тем как покупать...
                          Ответить
                        • >И они сказали, что это для людей искуства и дизайнеров.
                          >Вот пидорасы!
                          Еще продукцию эппл очень уважают говноеды.
                          Ответить
                        • 14 дней на возврат не катят?
                          Ответить
                          • Я тут подумал. Дамы не нужны. Буду пользоватся макбуком.

                            Макось снесу и поставлю нормальный дистр линукса с копирайтами говна.

                            Если мимо меня будет проходить какой-нибудь питушок, то он поймет, что я очень крут, так как пользуюсь продукцией эпла.

                            Макбук для людей искусства, а я книгу "искусство программирования" читал.
                            Ответить
            • Джон Коннор Кармак. Спаситель человечества. Создатель игр. Да и просто очень идейный человек.
              Ответить
              • > Да и просто очень идейный человек.
                Комсомолец, спортсмен, и просто красавец.
                Ответить
          • >absolut 9 дней назад #
            >TarasB Позавчера #
            Мне сразу вспомнился твой ответ про говно на анализы.
            Ответить
    • вот названия переменных сменить и можно смело на IOCCC отправлять
      Ответить
    • Царский код
      Ответить

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