1. C++ / Говнокод #17127

    +57

    1. 1
    2. 2
    float factor = ((float)sizeof(char) / sizeof(wchar_t));
    fileSize = (long)((float)fileSize * factor);

    вот так выглядит деление на sizeof(wchar_t) :)

    Запостил: fsmoke, 18 Ноября 2014

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

    • Кроссплатформенно, с расчетом - вдруг у нас будет платформа где char=16 бит, а wchar_t - 8.
      Ответить
      • Правда там это все равно не сработает, ведь sizeof(char)==1. Но мы хотя бы попытались!
        Ответить
    • много скобочек.
      long fileSize = ...;
      double factor = (double)sizeof(char) / sizeof(wchar_t);
      fileSize = fileSize * factor;

      и внезапно все не так уж и страшно
      Ответить
    • нахуй тут флоат?!
      Ответить
      • float работает быстрее, чем double
        Как не тебе, г-девщику это знать
        Ответить
        • нахуй тут вообще плавучка?
          Ответить
          • >>плавучка
            Хотите сказать тут хватит целочисленки?

            Тоесть сам факт деления размера чара на размер широко чара с последующим умножением на размер файла кажется Вам вполне себе бест-практисом?
            Ответить
          • Это необходимость - говно-ж не тонет.
            Ответить
      • К.О. поясняет - он тут не нужен, в этом и говно. Можно было разделить fileSize на sizeof(wchar_t).
        Ответить
        • А ещё при 1/3 можно получить неверный результат.
          Ответить
      • Вы так говорите, словно бы возмущаетесь: а почему не double??
        Ответить
        • Ты так говоришь, как будто double это что-то противоположное float. Extended - вот тип обеспечивающий приемлемую точность в данном случае.
          Ответить
          • Тут нужен rational (дроби).
            Ответить
            • BigDecimal
              Ответить
              • 1/3 не схавает. Всё-таки надо настоящий Rational с числителем и знаменателем.
                Ответить
                • Ну да, не схавает, будет 0.3333333333333333.
                  Но мне почему-то кажется что для такой задачи вполне хватит такого вот представления
                  Ответить
                • Откуда вы все берёте 1/3 и чем он плох? (только не надо говорить про то, что factor = 1/3 будет равен нулю, это не всегда правда и только отговорка)
                  В целых числах всё равно fileSize округляется. Если взять число не короче, чем sizeof(decltype(fileSize)) + log2(sizeof(char)), то всё должно нормально работать для любых fileSize. Или тут ещё подвох есть?
                  Ответить
                  • Говоря более формально, чем плохо ниже написанное?
                    long long fileSize2 = fileSize * (long long) sizeof(char);
                    fileSize2 = fileSize / (long long) sizeof(wchar_t);
                    fileSize = fileSize2; // будет работать, даже если char не будет помещаться на CD
                    Ответить
                    • Не хватает операции MulDiv, которая способна работать с промежуточным результатом двойного размера. В Форте такая есть, кстати.
                      Ответить
                      • И да, если учесть напоминание гостя, тут вообще всё хорошо. Ни плавающих питухов, ни mulDiv, ни 1/3
                        fileSize = fileSize / sizeof(wchar_t);
                        // будет работать до тех пор, пока конардо не пишет стандарт
                        Ответить
                        • и ведь будет работать.......
                          /*другой гость*/
                          Ответить
        • лолшто?!
          Ответить
    • *г-девщику,
      Ответить
    • И вышло у меня в ответе: Два землекопа и две трети
      Ответить
    • И вот результат! Так сказать, "на лице"... у этого пацана. Егорчик (усмехаюсь), новый дружбан. И мне совсем не стыдно. Мне интересно! Как там, show must go on. Думаю, ну, вчера всё было второпях-впопыхах, нормально даже не познакомились.
      Ответить

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