Мне было интересно, почему в C/С++ есть функция sqrt(), поскольку мы можем добиться того же, используя
pow(x,0.5);
чем sqrt(x)
отличается от pow(x,0.5)
. Есть ли конкретная причина наличия функции sqrt?
Мне было интересно, почему в C/С++ есть функция sqrt(), поскольку мы можем добиться того же, используя
pow(x,0.5);
чем sqrt(x)
отличается от pow(x,0.5)
. Есть ли конкретная причина наличия функции sqrt?
Я провел для вас тест, чтобы проверить производительность 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 секунд на моем компьютере. Так что производительность намного лучше. Как уже упоминалось, удобочитаемость - это другая причина.
Я помню, где-то читал, что sqrt() — это особый случай, который гарантируется спецификацией IEEE для правильного округления. Я поищу это, чтобы найти источник. Это также должно быть немного быстрее, потому что ему нужно обрабатывать только один случай.
Даже если бы они были одинаковыми, было бы неплохо иметь встроенный псевдоним для часто используемой функции!
Редактировать: Согласно IEEE-754, функция pow() и sqrt() должны быть реализованы таким образом, чтобы округленное значение было максимально близким представлением с плавающей запятой к реальному значению. Однако sqrt() все же должен быть быстрее.
Конечно, если вы думаете только о математической эквивалентности...
Но с точки зрения алгоритмов вычисления результата, sqrt
специфичен для одной вещи, тогда как pow
является общим.
Таким образом, вы можете (правильно) предположить, что можно написать более быструю функцию для sqrt
, чем для общей функции pow
.
sqrt(x)
улучшает читаемость по сравнению сpow()
. - person GeekFactory   schedule 02.07.2013