Существует ли функция Fast C или C++ standard library для двойного прецизионного обратного квадратного корня?

я печатаю

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

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

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

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

4 ответов


нет. Нет, нет. Не на C++. Нет.


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

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


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

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

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

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


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

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

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