2017-01-11 3 views
-1

Как приблизиться к sqrt(float32bit x), если я знаю, что x<=1?Быстрое приближение square_root (x) с известным 0 <= x <= 1

Должны быть некоторые приемы для использования диапазона x<=1.

Результат возврата не обязательно должен быть точным, максимальная погрешность может быть <0.001.
(0.001 это просто магическое число, вы можете изменить его.)

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

Он полезен для частиц в моей 3D-игре (VS 2015 + Ogre3D + Bullet), и я не могу найти подсказки об этом.
Я сомневаюсь, что причиной бури-нисходящего ветра является то, что это похоже на задание/интервью?
... или решение уже хорошо известно?

+1

Проверьте [быстрый обратный квадратный корень] (https://en.wikipedia.org/wiki/Fast_inverse_square_root). –

+0

@ Mark Ransom Зависит от платформы? – javaLover

+0

@ javaLover Нет эффективной, стандартно-совместимой реализации этого трюка, но она достаточно переносима. –

ответ

2

Квадратные корни обычно вычисляются через FSQRT which getting increasingly faster. Это одна инструкция, которую вы практически не можете победить. Например, быстрый обратный квадратный корень не поможет, если вы не можете напрямую использовать его результат. Если вам нужно снова инвертировать его, то только FDIV займет примерно столько же времени, сколько у FSQRT.

+0

Спасибо! Это ценная информация! Теперь я перестану искать эту вещь. – javaLover

+0

Вам не нужно делиться, чтобы использовать обратный квадратный корень. '1/(1/√x)' == 'x * (1/√x)'. –

+0

@javaLover, прежде чем вы перестанете искать, возможно, захотите взглянуть на [Почему SSE скалярный sqrt (x) медленнее, чем rsqrt (x) * x?] (Http://stackoverflow.com/questions/1528727/why-is-sse -scalar-sqrtx-медленнее, чем rsqrtx-х). –

Смежные вопросы