Учитывая double x
, известно, что это более эффективно использовать x*x
вместо pow(x,2)
, Представьте для простоты, что мы должны вычислить квадратный корень из x
: поскольку это унарная операция, для этого у нас есть sqrt(x)
, Теперь также поднимая x
ко второй власти это унарная операция, но мы ничего подобного (насколько я знаю) pow2(x)
,
Я реализовал свой собственный pow2
как:
inline double pow2(double a){return a*a;}
который должен быть еще лучше, чем pow(a,2)
, но это основано на *
оператор, который не является унарным.
Как реализовать подлинную унарную реализацию pow2
? Будет ли это самый эффективный способ получить вторую степень double
?
ПРИМЕЧАНИЕ: я осознаю тот факт, что каждая действительная сила положительного действительного числа является унарной операцией и что бессмысленно определять бесконечное число pow2
, pow3
, pow3.14
… с практической точки зрения я очень доволен pow(double, double)
,
«это более эффективно использовать
x*x
вместоpow(x,2)
»
Не конечно Больше эффективный. Это может быть то же самое. С позволяет анализировать способность таких функций, как pow()
и оба могут испустить один и тот же код.
Компилятор может не анализировать ваши pow2()
и создать неоптимальный код по сравнению с pow(a,2)
,
Если это действительно так, профилируйте свой код. Еще что Лучший на одной платформе могут отличаться на других.
Как реализовать настоящую унарную реализацию pow2?
inline double pow2(double a){return a*a;}
все в порядке.
Будет ли это самый эффективный способ получить вторую силу двойника?
«самый эффективный» -> я предлагаю не использовать функцию, просто x*x
,
Также обратите внимание, что C позволяет FP оценивать с более высокой точностью, что требуется. Исследование FLT_EVL_METHOD
. Цель для наиболее эффективный способ получить вторую двойную степень с функцией может победить общую производительность.
Других решений пока нет …