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