Продолжаем тему распределённого lc-генератора.
Форум — Development
Кому лень читать - надо сделать(подсказать куда копать) x*3877 mod 139968, где x = 0(а может и от одного)...139967 на 32битных числах(а в идеале на float), быстро. Быстро - это максимум штук десять умножений/сложений.
Всем кто помог в прошлой теме - спасибо. В конечном итоге вышло это: http://pastebin.com/rnLwXiUv
//g++ main.cpp -Ofast -march=native -flax-vector-conversions -std=gnu++1y -pthread//пока только avx intel sb+
(0.914s)13.53tpc
(0.073s)1.08tpc
Это конечно хорошо(на самом деле оно тупо упирается в память и реально - оно раз в 20быстрее).
Но этого мало, проблема в том, что оно на даблах из-за «быстрого» «деления» и из-за того, что интел забил на целочисленную арифметику. Ну из-за пту.
Т.е. даблы только из-за:
double mod_139968(double n) {
return n + (floor(n * 1. / 139968) * -139968);
}
//n * 1. / 139968 - конкретно этого
Я пытался смочь сделать это на 32битных интах - у меня не вышло, ибо пту. Прошу помощи.