Существует ли быстрая стандартная библиотечная функция C или C ++ для обратного квадратного корня двойной точности?

Я печатаю

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

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

Существует ли стандартная библиотека C или C ++ для обратного квадратного корня, которая

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

6

Решение

Нет, нет Не в C ++. Нету.

9

Другие решения

Вы можете использовать эту функцию для более быстрого вычисления обратного квадратного корня
В википедии есть статья о том, как это работает: https://en.wikipedia.org/wiki/Fast_inverse_square_root
Также есть версия C этого алгоритма.

float invSqrt( float number ){
union {
float f;
uint32_t i;
} conv;

float x2;
const float threehalfs = 1.5F;

x2 = number * 0.5F;
conv.f  = number;
conv.i  = 0x5f3759df - ( conv.i >> 1 );
conv.f  = conv.f * ( threehalfs - ( x2 * conv.f * conv.f ) );
return conv.f;
}
1

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

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

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

0

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

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

-1

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

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

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

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

-1
По вопросам рекламы [email protected]