재곱근, 지수, 로그

황상익·2023년 10월 25일
0

자료구조 정리

목록 보기
12/13

<기본코드>

public class Chap_06 {
    public static void main(String[] args) {

//      1. 제곱, 제곱근, 지수
        System.out.println("== 제곱 ==");
        System.out.println(Math.pow(2,3));
        // Math.pow(밑,몇 제곱)
        System.out.println(Math.pow(2, -3));
        System.out.println(Math.pow(-2, -3));
        // -제곱의 경우 1/2의 3승 = 1/8
        System.out.println(Math.pow(2,30));
        System.out.printf("%.0f\n" , Math.pow(2,30));

        System.out.println("== 제곱근 ==");
        System.out.println(Math.sqrt(16));
        //Math.sqrt() = 제곱근
        System.out.println(Math.pow(16, 1.0/2));
        // -> 16을 1/2(16의 1/2승)
        System.out.println(Math.pow(16, 1.0/4));

//      참고) 절대 값 (Math.abs())
        System.out.println("== 절대 값 ==");
        System.out.println(Math.abs(5));
        System.out.println(Math.abs(-5));

//      2. 로그 (자연상수와 밑이 10인 로그를 지원)
        System.out.println("== 로그 ==");
        System.out.println(Math.E);
        System.out.println(Math.log(2.718281828459045)); // 1
        System.out.println(Math.log10(1000));
        System.out.println(Math.log(4)/ Math.log(2));

    }
}

<연습문제>

// Practice
// 제곱과 제곱근을 Math 없이 구현하기
public class Practice_07 {
    static double pow(int x, double y){ //반환은 double, 밑은 int, 지수는 double
        double result = 1;
        boolean isMinus = false;

        if (y == 0){
            return 1;
            //음수인 경우
        } else if (y < 0) {
            y *= -1;
            isMinus = true;
        }
        for (int i = 0; i < y; i++) {
            result *= x; // 반복해서 곱해주면, y제곱 만큼 곱해주면 된다.
        }

        //return result;
        return isMinus ? 1 / result : result; //음수면 나눠서 리턴 아니면 그냥 리턴
    }

    static double sqrt (int a){ //바빌로니아 방법, 뉴튼 방법
        /*
        바빌로니아 방법
        어떤수 N에 대해서 제곱근을 구한다고 하면
        루트 N = Xn + E(입실론 - 가장 작은 수)
        N = N의 제곱근에 루트 = (Xn + E) 제곱
        Xn의 제곱 + 2XnE + E의 제곱 (입실론의 제곱은 엄청 작은 수라 생략)
        N = Xn의 제곱에 + 2XnE
        =입실론 = (N - Xn의 제곱) / 2XnE
        =Xn  + ((N -Xn의 제곱)/2Xn))
        =Xn + N/2Xn - Xn/2
        =Xn/2 + N/2Xn
        =1/2(Xn + N/Xn)

        Xn+1 = 1/2(Xn + N/Xn)
         */

        double result = 1;
        for (int i = 0; i < 10; i++) {
            result = (result + (a/result)) / 2;
        }
        return result;
    }

    public static void main(String[] args) {

//      Test code
        System.out.println("== Math pow ==");
        System.out.println(Math.pow(2, 3));
        System.out.println(Math.pow(2, -3));
        System.out.println(Math.pow(-2, -3));

        System.out.println("== My pow ==");
        System.out.println(pow(2, 3));
        System.out.println(pow(2, -3));
        System.out.println(pow(-2, -3));

        System.out.println("== Math sqrt ==");
        System.out.println(Math.sqrt(16));
        System.out.println(Math.sqrt(8));

        System.out.println("== My sqrt ==");
        System.out.println(sqrt(16));
        System.out.println(sqrt(8));

    }
}

for (int i = 0; i < 10; i++) {
result = (result + (a/result)) / 2;
}
아직 이부분은 쪼금 더 복습이 필요 할 것 같다 ㅜ

profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글