Разница между sqrt (x) и pow (x, 0,5)

Мне было интересно, почему в C/С++ есть функция sqrt(), поскольку мы можем добиться того же, используя

pow(x,0.5);

чем sqrt(x) отличается от pow(x,0.5) . Есть ли конкретная причина наличия функции sqrt?


person Alex    schedule 02.07.2013    source источник
comment
Не думаю, что для этого есть особая причина. Поскольку операция квадратного корня очень распространена, а sqrt(x) улучшает читаемость по сравнению с pow().   -  person GeekFactory    schedule 02.07.2013
comment
зачем велосипед, когда есть велосипед?   -  person Raghu Srikanth Reddy    schedule 02.07.2013
comment
Почему у нас есть умножение, когда вы можете просто складывать в цикле?   -  person It'sPete    schedule 02.07.2013
comment
Почему за это проголосовали? Это законный вопрос!! Было бы неплохо узнать, почему sqrt работает быстрее на моем компьютере.   -  person Millemila    schedule 20.05.2014


Ответы (3)


Я провел для вас тест, чтобы проверить производительность sqrt(x) и pow(x,0.5).

1.

for(int i=0;i<100000000;i++) 
    pow(double(i),0.5);

2.

for(int i=0;i<100000000;i++)
    sqrt(double(i));  

Первый занял около 20 секунд, а второй занял около 2 секунд на моем компьютере. Так что производительность намного лучше. Как уже упоминалось, удобочитаемость - это другая причина.

person banarun    schedule 02.07.2013
comment
У меня получились обратные результаты... - person Steve P.; 02.07.2013
comment
На самом деле я провел тест 3 раза, чтобы убедиться. У меня не было большого разнообразия. Пожалуйста, проверьте снова. - person banarun; 02.07.2013
comment
Протестируйте. - person Steve P.; 02.07.2013
comment
@SteveP.: Этот код скомпилирован с -O3? - person Oliver Charlesworth; 02.07.2013
comment
@steve P Какой процессор они используют? Код, который занял более 20 секунд на моем ПК, выполнялся там за 0,6 секунды. Может быть, для больших значений мы сможем найти разницу. - person banarun; 02.07.2013
comment
@OliCharlesworth, если вы имеете в виду сделанные оптимизации, я поменял местами два сегмента и все равно получил те же результаты. - person Steve P.; 02.07.2013
comment
@banarun понятия не имею. Если бы они на самом деле не отложили этот вопрос, я бы попытался ответить на него, основываясь на источнике для двоих... - person Steve P.; 02.07.2013
comment
@banarun попробуй поменять местами два в своем коде на своем компьютере и посмотреть, что произойдет. - person Steve P.; 02.07.2013
comment
@Steve P Я действительно запускал эти две программы в разных программах. - person banarun; 02.07.2013
comment
Я думаю, что функция pow оптимизирована для sqrt() в ideone. когда я скомпилировал с -O3, не было никакой разницы во времени, затраченном на них. - person banarun; 02.07.2013
comment
с оптимизацией -O3 и выше такой тест, как ваш, просто не будет работать, поскольку фактически не вычисляется значение... use int main() { double tot; часы_t t1; общ = 0,0; t1 = часы(); for( int i = 0; i ‹ MAX; i++ ) tot += pow(double(i),-0.5); cout ‹‹ tot = ‹‹ tot ‹‹ time: ‹‹ clock()-t1 ‹‹ \n; общ = 0,0; t1 = часы(); for(int i = 0; i ‹ MAX; i++) tot += 1.0 / sqrt((double)i); cout ‹‹ tot = ‹‹ tot ‹‹ time: ‹‹ clock()-t1 ‹‹ \n; вернуть 0; } - person ; 04.06.2014
comment
@banarun, с другой стороны, мои результаты совпадают с вашими; sqrt на моей машине примерно в 10-20 раз быстрее, даже с добавлением деления к sqrt... - person ; 04.06.2014

Я помню, где-то читал, что sqrt() — это особый случай, который гарантируется спецификацией IEEE для правильного округления. Я поищу это, чтобы найти источник. Это также должно быть немного быстрее, потому что ему нужно обрабатывать только один случай.

Даже если бы они были одинаковыми, было бы неплохо иметь встроенный псевдоним для часто используемой функции!

Редактировать: Согласно IEEE-754, функция pow() и sqrt() должны быть реализованы таким образом, чтобы округленное значение было максимально близким представлением с плавающей запятой к реальному значению. Однако sqrt() все же должен быть быстрее.

person vroomfondel    schedule 02.07.2013
comment
См. stackoverflow.com/questions/22259537. - person Charles L Wilcox; 26.05.2016

Конечно, если вы думаете только о математической эквивалентности...

Но с точки зрения алгоритмов вычисления результата, sqrt специфичен для одной вещи, тогда как pow является общим.

Таким образом, вы можете (правильно) предположить, что можно написать более быструю функцию для sqrt, чем для общей функции pow.

person paddy    schedule 02.07.2013