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