2012-10-16 4 views
3

Я считаю себя набравЕсть ли быстрая стандартная библиотека C или C++ для двойной точности обратного квадратного корня?

double foo=1.0/sqrt(...); 

много, и я слышал, что современные процессоры имеют встроенные обратные квадратный корень опкоды.

Есть ли C или C++ стандартная библиотека обратная функция квадратного корня,

  1. использует двойной точности с плавающей точкой?
  2. такой же точный как 1.0/sqrt(...)?
  3. так же быстро и быстро, как результат 1.0/sqrt(...)?
+0

@ Периевый оксид: это был обратный квадрат, а не обратный квадратный корень. – Dan

+0

Упс. Неважно. – PherricOxide

+0

#define INSQRT (x) (1.0/sqrt (x)) –

ответ

7

№ Нет. Нет. Не в C++. Неа.

-1

Почему бы не попробовать это? #define INSQRT(x) (1.0/sqrt(x))

Сво так же быстро, требует меньше набирать (заставляет вас чувствовать себя, как и его функции), использует двойной точности, как точно, как 1/SQRT (..)

+1

почему проголосовать? –

+3

Я не спускал вниз, но здесь здесь не нужно использовать макрос, когда функция будет работать. (Вы даже сказали это сами: сделайте это * почувствуйте * как функцию? Просто на самом деле сделайте функцию.) – GManNickG

+0

@GManNickG Причина, по которой я не преобразовал ее в функцию, заключается в том, что в вопросе четко сказано: «так же быстро или быстрее, чем результат 1.0/sqrt (...) ».Создание функции добавит дополнительные накладные расходы, сделав «утверждение» 1.0/sqrt (...) SLOWER. –

0

Если вы нашли себя написать то же самое над и более, вы должны думать о себе «функции!»:

double invsqrt(const double x) 
{ 
    return 1.0/std::sqrt(x); 
} 

Теперь код более самодокументирован: люди не должны вывести1.0/std::sqrt(x) является обратный квадратный корень, они чтения это , Кроме того, теперь вы можете подключиться к любой реализации, которую хотите, и каждый сайт-вызов автоматически использует обновленное определение.

Чтобы ответить на ваш вопрос, нет, для него нет функции C (++), но теперь, когда вы сделали одно, если вы обнаружите, что ваша производительность слишком не хватает, вы можете заменить свое собственное определение.

+0

смешно я написал аналогичный ответ и получил downvoted –

+0

нарушает правило № 3 в вопросе –

+0

зачем полагаться на компилятор, когда вы можете использовать препроцессор? Я все еще думаю, что я не заслужил голосования -ve :-( –

0

Если не боитесь использовать свои собственные функции, попробуйте выполнить следующие действия:

template <typename T> 
T invsqrt(T x) 
{ 
    return 1.0/std::sqrt(x); 
} 

Это должно быть столь же быстро, как и в любом современном оптимизированным компилятором в оригинальной 1.0/std::sqrt(x). Кроме того, его можно использовать с удвоениями или поплавками.

+0

нарушает правило №3 в вопросе! –

+2

Извините, как я понимаю, это должно быть «так же быстро». – Ryan

+0

Прочитайте http://stackoverflow.com/questions/2442358/do-c-templates-make-programs-slow, чтобы понять, почему или почему функции шаблонов не должны быть медленнее, чем не-шаблонный код. – Ryan