Я печатаю
double foo=1.0/sqrt(...);
много, и я слышал, что современные процессоры имеют встроенные коды операций с обратным квадратным корнем.
Существует ли стандартная библиотека C или C ++ для обратного квадратного корня, которая
1.0/sqrt(...)
?1.0/sqrt(...)
?Нет, нет Не в C ++. Нету.
Вы можете использовать эту функцию для более быстрого вычисления обратного квадратного корня
В википедии есть статья о том, как это работает: 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;
}
Если вы не боитесь использовать свои собственные функции, попробуйте следующее:
template <typename T>
T invsqrt(T x)
{
return 1.0 / std::sqrt(x);
}
Это должно быть так же быстро, как оригинал 1.0 / std::sqrt(x)
в любом современно оптимизированном компиляторе. Кроме того, он может быть использован с двойными или поплавками.
почему бы не попробовать это? #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 (++), но теперь, когда вы ее сделали, если обнаружили, что вашей производительности слишком не хватает, вы можете заменить свое собственное определение.