본문 바로가기

TIL

Day39(정수제곱근판별,Math.pow,Math.sqrt)

Math.pow와 Math.sqrt

 

Math.pow(a,b)는 a의 b 제곱을 반환합니다.

 

Math.sqrt(x)는 x의 제곱근을 반환합니다. 

 

Math.pow와 Math.sqrt는 내부적으로 복잡한 알고리즘을 사용하여 근사값을 계산합니다. 

 

둘 다 double형 타입의 값을 인자로 받고 반환합니다. 따라서 정수형 타입의 값을 사용하려면 형 변환을 해주어야합니다.

 

정확도와 속도를 고려하여 적절한 메소드를 선택하는 것이 좋다고 알려져있는데 정확도와 속도를 판단하는 것에 대해 아직 이해하지 못했다. 정확도와 속도에 관해 찾아본 결과

 

정확도는 Math.pow와 Math.sqrt의 구현 방식에 따라 달라집니다. 일반적으로 Math.pow는 2진수로 변환하여 거듭제곱을 계산하고, Math.sqrt는 뉴턴-랩슨 방법이나 비슷한 근사법을 사용합니다. 이러한 방식은 오차를 최소화하기 위해 여러 번의 반복을 수행합니다. 정확도가 높아질수록 속도가 느려질 수 있습니다.

 

속도는 Math.pow와 Math.sqrt의 인자와 반환값에 따라 달라집니다. 일반적으로 Math.pow는 제곱근보다 더 복잡한 연산을 수행하므로 속도가 느립니다. 하지만 인자가 정수형이거나 특정한 값이면 최적화된 코드를 사용할 수 있습니다. 예를 들어 x의 2제곱근은 x*x로 계산하는 것이 빠릅니다. 반면에 Math.sqrt는 인자가 음수이면 NaN을 반환하므로 예외처리를 해주어야 합니다.

 

결론적으로, 정확도와 속도를 판단할 때는 

- 인자의 타입과 범위

- 반환값의 타입과 범위

- 구현 방식과 반복 횟수

- 최적화 가능성과 예외처리

결론적으로 상황에 따라 달라진다는 얘기인거 같습니다. 

 

뉴턴-랩슨 방법도 아직 이해하기 너무 어렵고 실질적으로 내가 아직 정확도와 속도를 판단할 실력은 아닌거 같다는 생각이 들었습니다. 

 

 

public class SquareRoot {
    public long solution(long n) {

        if (n == Math.pow((long) Math.sqrt(n), 2)) {
            return (long) Math.pow(Math.sqrt(n) + 1, 2);
        }
        return -1;
    }
}

Math.pow와 Math.sqrt에 대한 메서드에 관하여 사용하는 방법에 대해서 간략하게 알아 처음 작성 했을 때는 타입에 대해 생각하지 못하고 double형 타입으로 그대로 사용했습니다. 타입이 달랐기에 정확도가 낮아 프로그래머스 코테 검증 부분에서 통과하지 못했습니다. 메서드 관련하여 찾아보고 타입 부분을 놓쳤다는걸 깨달았습니다.

 

제네릭(Generic)

데이터의 타입을 일반화하는 것을 의미합니다. 즉, 클래스나 메소드에서 사용할 데이터의 타입을 컴파일 시에 미리 지정하는 방법입니다

 

 

'TIL' 카테고리의 다른 글

Day40(특정 commit부르기)  (0) 2023.03.16
try catch 쓰는 이유  (0) 2023.03.14
Day38(pipe token 에러메세지, List /ArrayList 사용 사이)  (0) 2023.03.12
Day37(랜덤은 테스트코드 하기 힘들다.)  (0) 2023.03.10
Day36()  (0) 2023.03.09