Подтвердить что ты не робот

Самая быстрая гипотенуза в javascript?

Я видел ряд вопросов об имитации и анимации в javascript, которые часто включают вычисление гипотенузы:

hypot = Math.sqrt(x*x + y*y);

Так как декартовы координаты являются оружием выбора в большинстве этих двигателей, эти вычисления необходимы, чтобы найти расстояние между парами точек и т.д. Таким образом, любое ускорение при вычислении гипотенузы может стать большой помощью для многих проектов.

С этой целью вы можете увидеть более быстрый метод, чем простая реализация выше? Я нашел приближение, которое было немного быстрее в Chrome, но оказалось намного медленнее в Firefox, основанном на этой функции аппроксимации в SuperCollider.

Изменить 2015-08-15: Я включил принятый ответ в Math.hypot; Я подозреваю, что прагматичный подход в настоящее время будет состоять в том, чтобы использовать Math.hypot или синтезированную функцию гипотонии, если она недоступна, и сравнить с квадратом (на каждый ответ), если этого достаточно, а Math.hypot недоступен.

4b9b3361

Ответ 1

В ECMAScript ES6 вы можете использовать Math.hypot:

// ES5 support

Math.hypot = Math.hypot || function(x, y){ return Math.sqrt(x*x + y*y) }

var x = 3, y = 4;

document.write(Math.hypot(x, y))

Ответ 2

Часто вам не нужно вычислять квадратный корень и hypot^2 = x*x + y*y достаточно. Например, если вы хотите сравнить расстояния и не нужны фактические значения.

Ответ 3

Важный момент, который многие не знают:

hypot = Math.sqrt(x*x + y*y);

Это работает теоретически, но на практике это может потерпеть неудачу. Если x настолько велико что x * x переполняется, код приведет к бесконечному результату.

Вот как вычислить sqrt (xx + yy) без риска переполнения.

max = maximum(|x|, |y|)
min = minimum(|x|, |y|)
r = min / max
return max*sqrt(1 + r*r)

Ссылка и полный текст: Джон Д. Кук - http://www.johndcook.com/blog/2010/06/02/whats-so-hard-about-finding-a-hypotenuse/

Ответ 4

Вы можете посмотреть на равенство x и y. Если равны, вы можете рассчитать гипотенузу как (x + y)/sqrt(2), где sqrt(2) - константа.

Таким образом, этот метод можно использовать для случая, когда x = y. Для других случаев его можно использовать с максимальной неточностью ~ 41%. Это большая ошибка. Но когда вы указываете допустимые пределы ошибок, вы можете использовать этот метод. Например, если определить допустимую ошибку до 5%, вы можете получить, что b должно быть между 0.515*a и 1.942*a.

Итак, если вам не нужна совершенная неточность ваших вычислений, вы можете повысить производительность вычислений с диапазоном значений.

По аналогии вы можете посмотреть на равенство x или y на zero. И с некоторой точностью вычисляют гипотенузу быстрее для этих случаев.

P.S. Я читал об этом в одной русской статье.