Унарный оператор в C или C ++ для второй степени числа - PullRequest
0 голосов
/ 15 ноября 2018

Учитывая 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).

1 Ответ

0 голосов
/ 15 ноября 2018

"более эффективно использовать x*x вместо pow(x,2)"

Не обязательно больше эффективно.Это может быть то же самое.C позволяет анализировать такие функции, как pow(), и обе могут генерировать один и тот же код.

Компилятор не может анализировать ваш pow2() и создавать неоптимальный код по сравнению с pow(a,2).

Если это действительно так, профилируйте ваш код.Но что лучше на одной платформе может отличаться на других.

Как реализовать настоящую унарную реализацию pow2?

inline double pow2(double a){return a*a;}ОК.

Был бы самый эффективный способ получить вторую двойную степень?

"самый эффективный" -> Я не предлагаю никаких функций, просто x*x.


Также обратите внимание, что C позволяет FP вычислять с более высокой требуемой точностью.Исследования FLT_EVL_METHOD.Цель для наиболее эффективного способа получить вторую двойную степень с функцией может нанести ущерб общей производительности.

...