Я использую основанный на журнале класс в C ++ для хранения очень маленьких значений с плавающей точкой (поскольку значения иначе выходят за рамки double
). Поскольку я выполняю большое количество умножений, это дает дополнительное преимущество преобразования умножений в суммы.
Однако в определенный момент в моем алгоритме мне нужно разделить стандартное значение double
на значение integer
, а затем сделать *=
на значение на основе журнала. Я перегрузил оператор *=
для моего класса, основанного на журнале, и значение правой части сначала преобразуется в значение на основе журнала, выполнив log()
, а затем добавляется к значению левой стороны.
Таким образом, фактически выполняемые операции - это деление с плавающей запятой, log()
и суммирование с плавающей запятой.
Мой вопрос, будет ли быстрее сначала преобразовать знаменатель в логическое значение, которое заменит деление с плавающей запятой вычитанием с плавающей запятой, приводя к следующей цепочке операций: дважды log()
, с плавающей запятой вычитание точек, суммирование с плавающей точкой.
В конце концов, все сводится к тому, быстрее или медленнее деление с плавающей точкой, чем log()
. Я подозреваю, что распространенным ответом будет то, что это зависит от компилятора и архитектуры, поэтому я скажу, что я использую gcc 4.2 от Apple на darwin 10.3.0. Тем не менее, я надеюсь получить ответ с общим замечанием о скорости этих двух операторов и / или идеей о том, как измерить разницу самостоятельно, поскольку здесь может быть что-то еще, например, выполнение конструкторов, которые выполняют преобразование типов и т. д.
Ура!