• Почему умножение работает быстрее деления?

    @sitev_ru
    sitev.ru - мой блог ...
    Вовсе не обязательно... Вот добился, что умножение работает медленнее, чем деление:

    rextester.com/NMZ47337

    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        cout << "Test mul" << endl;
        int tick1 = GetTickCount();
        
        double a = 1000000000000;
        for (int i = 0; i < 1000000; i++) {
            a *= 0.99;
        }
        
        int tick2 = GetTickCount();
        
        cout << "time = " << tick2 - tick1 << endl;
        cout << a << endl;
    
        cout << "Test div" << endl;
        tick1 = GetTickCount();
        
        a = 1000000000000;
        for (int i = 0; i < 1000000; i++) {
            a /= 1.0001;
        }
        
        tick2 = GetTickCount();
        
        cout << "time = " << tick2 - tick1 << endl;
        cout << a << endl;
    }


    Вот такие цифры у меня получились:

    Test mul
    time = 47
    2.42092e-322
    Test div
    time = 16
    3.73872e-32


    Умножение медления в три раза)
    Ответ написан
    2 комментария
  • Почему умножение работает быстрее деления?

    @nirvimel
    Во-первых, это касается только компилируемых ЯП в которых целые и действительные числа представлены нативными типами данных аппаратной платформы. То есть 8/16/32/64-целые и 32/64/80-битные действительные. Все это никаким образом не касается динамических скриптов, а также языков, в которых числа по-умолчанию с длинной арифметикой или пределы значений не указаны в спецификации языка (обычно это означает использование длинной арифметики) - во всех этих случаях вычисления будут идти в десятки/сотни/тысячи раз медленнее чем на голом железе и разницы между умножением и делением (а также другими операциями) не будет заметно вообще.
    Во-вторых, даже на компилируемых языках с нативными типами данных, иногда встречаются дополнительные проверки (на переполнение, например) и особые правила применения математических действий, что влияет на производительность гораздо сильнее, чем разница между делением и умножением. Хороший пример - удивительный случай на cython.
    Ответ написан
    Комментировать
  • Почему умножение работает быстрее деления?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    насчет "лучше умножать на 0,5" хз, потому что плавающая точка, но, наверно да

    а так все просто:
    современный комп, и комп 20 лет назад, и комп 30 лет назад - это обычный транзистор
    (когда изобретут фотонный проц - будет не обычный, хотя..)

    а обычный транзистор имеет всего два состояния: 0 (нет напряжения) и 1 (идет ток)

    и умеет транзистор этими двумя состояниями всего два действия:
    первое: сложение (0+1 = 1, 0+0=0, 1+1 = 01 и т.п.)
    второе: смена знака (честно - уже не помню как там куда идет ток в этом случае)

    все. больше ничего комп не умеет.

    потому арифметика реализуется примерно так:
    сложение: первое число СЛОЖ второе число
    вычитание: первое число СМЕНЗНАК второе число СЛОЖ первое число
    умножение: много раз СЛОЖ и занесение в стек, что тоже СЛОЖ
    деление: многораз СЛОЖ и зансение в стек + чуть меньше раз СМЕНЗНАК и снова в стек

    как видишь, при делении больше всего операций, по сути деление - это куча сложений с разным знаком, и величина кучи больше кучи уножений

    отсюда же растут ноги у точности плавающей точки - СЛОЖ и СМЕНЗНАК тоже нужно сделать кучу раз в зависимости от точности
    Ответ написан
    3 комментария
  • Как инициализировать статическое поле?

    AtomKrieg
    @AtomKrieg
    Давай я поищу в Google за тебя
    Если метод не виртуальный, то в конструкторе вызвать. Если нельзя в конструкторе, то в программе надо создать место, где вы будете инициировать подобные конструкции перед главным циклом (например в начале main).
    Ответ написан
    Комментировать