개요
Math.hypot 함수는 가변적인 개수의 number 타입의 값을 인자로 전달받아 다음의 관계를 만족하는 k를 반환한다.
\(\sum_{i=1}^{n}v^{2} = k^{2} \)
Math.hypot()
hypot은 삼각형의 빗변을 의미하는 hypotenuse를 줄인 단어이다. 직각 삼각형의 빗변이 아닌 a, b의 길이를 이용하여 빗변 c의 길이를 구하는 피타고라스 방정식은 다음과 같다.
\(a^{2} + b^{2} = c^{2} \)
피타고라스 방정식으로부터 생각하면 Math.hypot 함수는 number 타입의 a, b를 전달받아서 c에 해당하는 값을 반환하는 함수이다. 특이한 점으로는 입력할 수 있는 number의 개수가 2개로 고정되어 있지 않다는 점이다.
인자를 하나만 입력하면 절댓값 함수인 Math.abs()와 동일한 결과를 반환한다.
Math.hypot(-100); // 100
Math.abs(-100); // 100
여러 개의 인자가 주어진 경우, 주어진 인자의 제곱합과 같아지는 \(c^{2} \)의 양의 제곱근 c를 반환한다.
Math.hypot(100, 100, 100, 100); // 200
또, Number.MAX_VALUE( 대략 \(10^{308} \))의 범위 안에서 hypot을 사용하지 않는 경우에 비하여 더 정확한 값을 반환한다. 오차가 없는 것은 아니다.
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot
Math.sqrt(1e200*1e200 + 1e200*1e200); // Infinity
Math.hypot(1e200, 1e200); // 1.414213562373095e+200
덧
hypot을 통해 얻은 값으로 대소 비교를 수행하여야 하는 경우, 소수점 이하의 수에 대한 비교가 정확하게 이루어지지 않을 수 있다. 주어진 값의 범위가 크지 않다면 제곱근을 취하지 않고 제곱된 수를 그대로 비교하는 방식을 활용할 수 있다. 이 방법으로 수를 정수 범위 안에서 비교할 수 있다.
아래는 연습문제
https://www.acmicpc.net/problem/20949
참고
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot