2013-07-02 3 views
7

мне было интересно, почему существует SQRT() в C/C++, как мы можем достичь того же с помощьюРазница между SQRT (х) и мощн (х, 0,5)

pow(x,0.5); 

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

+0

Я не думаю, что для этого есть особая причина. Поскольку операция с квадратным корнем очень распространена, а 'sqrt (x)' улучшает читаемость по сравнению с 'pow()'. – GeekFactory

+7

Почему есть велосипед, когда есть велосипед? –

+1

Почему у нас есть умножение, когда вы можете просто добавить в цикл? –

ответ

10

Я побежал тест для вас, чтобы проверить работу 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-й один заняло около 2 секунд на моем компьютере. Таким образом, производительность намного лучше. Как уже упоминалось, читаемость является другой причиной.

+0

Я получил противоположные результаты ... –

+0

Я фактически проверил тест 3 раза, чтобы убедиться. У меня не было большой вариации. Пожалуйста, проверьте еще раз. – banarun

+1

[Проверить его] (http://ideone.com/dlwLGR). –

5

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

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

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

5

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

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

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

+0

См. Http://stackoverflow.com/questions/22259537/ –