LINUX.ORG.RU

Избранные сообщения DarkEld3r

Продолжаем тему распределённого 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битных интах - у меня не вышло, ибо пту. Прошу помощи.

dikiy GPFault

 , , ,

registrant27492 ()