ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java java.lang - 3, Math 클래스
    Java 2024. 2. 25. 15:49
    728x90
    반응형

    Math 클래스

        기본적인 수학계산에 유용한 메서드로 구성

        Math 클래스의 생성자는 접근 제어자가 private기 때문에, 
        다른 클래스에서 Math인스턴스를 생성할 수 없도록 되어있다.

        클래스 내에 인스턴스변수가 하나도 없어서 인스턴스를 생성할 필요가 없기 때문이다.

        Math클래스의 메서드는 모두 static이며, 2개의 상수만 정의해놓았다.

    public static final double E = 2.7182818284590452354;           // 자연로그의 밑
    public static final double PI = 3.14159265358979323846;         // 원주율


        

    올림, 버림, 반올림

            원하는 자리 수에서 반올림된 값을 얻기 위해서는 round()를 사용해야 하는데, 
            이 메서드는 항상 소수점 첫째 자리에서 반올림을 해서 정수값(long)을 결과로 돌려준다.
            따라서, 10의 n제곱으로 곱한 후, round()를 호출하고, 다시 곱한 수로 나누면된다.

            정수형 간의 연산에서는 반올림이 이루어지지 않는다.       

    90.7552 * 100   >> 9075.52
    >>
    Math.round(9075.52) >> 9076
    >>
    9076 / 100.0 >> 90.76
    9076 / 100 >> 90


    rint()도 round처럼 소수점 첫 째자리에서 반올림하지만 반환값이 double이고,
    두 정수의 정가운데 있는 값은 가장 가까운 짝수 정수를 반환한다.

    round(-1.5)     // -1
    rint(-1.5)      // -2.0


    round는 소수점 첫째자리가 5일 때, 더 큰 값으로 반올림하니까 -1이 되지만, 
    rint()는 -1.5같이 홀수(-1.0)와 짝수(-2.0)의 딱 중간에 있는 경우 짝수(-2.0)를 결과로 반환

    그리고 음수에서는 양수와 달리 -1.5를 버림하면 -2.0이 된다

    예외를 발생시키는 메서드

            jdk1.8부터 메서드 이름에 'Exact'가 포함된 메서드들이 새로 추가되었다.
            이들은 정수형 간의 연산에서 발생할 수있는 오버플로우를 감지하기 위한 것이다.

    int addExact(int x, int y)      // x + y 등의 메서드


    연산자는 단지 결과를 반환할 뿐, 오버플로우의 발생 여부에 대해 알려주지 않는다.
    그러나 위의 메서드는 오버플로우가 발생하면, 예외(ArithmeticException)를 발생시킨다.

    삼각함수와 지수, 로그

            제곱근을 계산해주는 sqrt()와 n제곱을 계산해주는 pow()가 있다.

    double 대각선 = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));


    삼각함수도 있다.

    double a = c * sin(PI/4);       // PI/4 radian = 45degree
    double b = c * cos(PI/4);       // PI/4 radian = 45degree
    double b = c * cos(toRadians(45));       // 각도를 라디안으로 변환


    삼각함수는 매개변수의 단위가 라디안이므로, 45도를 라디안 값으로 변환해야 한다.


    180degree = PI rad
    >>
    45degree = PI/4 rad다.

    atan2 메서드는 직각 삼각형에서 두 변의 길이 a, b를 알면 끼인각 세타를 구해준다.
    이 메서드도 결과값이 라디안이므로, 도 단위로 변경하려면 180/PI를 곱하거나 toDegrees(double angrad)를 이용하면 된다.

    24자리의 2진수는 10진수로 몇 자리의 값인지를 알아내려면 다음의 식을 풀어야 한다

    2^24 = 10^x


    양 변에 상용로그를 취하면

    24 * log10(2) = x


    계산하면 약 7.2이다.
    그래서 float타입의 정밀도가 7자리인 것이다.
    마찬가지로 double타입의 정밀도는 15자리

    참고            float타입의 가수는 23자리지만, 정규화를 통해 1자리를 더 확보할 수 있어서 24자리이다. double타입 역시 52 + 1 = 53자리

    StrictMath 클래스

            Math 클래스는 최대한의 성능을 얻기 위해 JVM이 설치된 OS의 메서드를 호출해서 사용한다.
            즉, OS에 의존적인 계산을 하고 있다.

            예를 들어, 부동소수점 계산의 경우 반올림 처리 방법 설정이 OS마다 다를 수 있기 대문에,
            자바로 작성된 프로그램임에도 불구하고 컴퓨터마다 결과가 다를 수 있다.

            이런 차이를 없애기 위해 성능을 다소 포기하는 대신, 
            어떤 OS에서 실행되어도 항상 같은 결과를 얻도록 Math클래스를 새로 작성한 것이 StrictMath 클래스

     

    정적 멤버 변수

        - E     : 자연상수(e)
        - PI    : 원주율


    정적 메서드

        - abs(int|long|float|double)                : x의 절댓값 반환

        - addExact(int|long a, int|long b)          : a와 b의 합을 반환. 단, 오버플로우 혹은 언더플로우가 발생할 경우 예외(java.lang.ArithmeticException) 발생

        - subtractExact(int|long a, int|long b)     : a와 b의 차를 반환. 단, 오버플로우 혹은 언더플로우가 발생할 경우 예외(java.lang.ArithmeticException) 발생 

        - multiplyExact(int|long a, int|long b)     : a와 b의 곱 반환. 단, 오버플로우 혹은 언더플로우가 발생할 경우 예외(java.lang.ArithmeticException) 발생 


        - floor(double x)                           : x의 소수부를 내림하여 반환
        - round(double x)                           : x의 소수부를 반올림하여 반환
        - ceil(double x)                            : x의 소수부를 올림하여 반환
        
        - decrement(int|long x)                     : x에 1을 뺀 값을 반환. 단, 오버플로우 혹은 언더플로우가 발생할 경우 예외(java.lang.ArithmeticException) 발생 

        - incrementExact(int|long x)                : x에 1을 더한 값을 반환. 단, 오버플로우 혹은 언더플로우가 발생할 경우 예외(java.lang.ArithmeticException) 발생 

        - log(double x)                             : x의 자연로그 반환
        - log10(double x)                           : x의 상용로그 반환

        - max(int|long|float|double a, int|long|float|double b)     : a와 b 중 더 큰 값 반환
        - max(int|long|float|double a, int|long|float|double b)     : a와 b 중 더 작은 값 반환

        - negateExact(int|long x)                   : x의 부호를 반전하여 반환. 단, 오버플로우 혹은 언더플로우가 발생할 경우 예외(java.lang.ArithmeticException) 발생 


        - random()                                  : 0 이상 1 미만의 무작위 실수 반환
        
        - sqrt(double x)                            : x의 제곱근(Square Root, x^(1/2))을 반환

        - cbrt(double x)                            : x의 세제곱근(Cubic Root, x^(1/3))을 반환한다.

        - pow(double a, double b)                   : a의 b제곱(a^b) 반환

        - toIntExact(long x)                        : 큰 정수(long)인 x를 일반 정수(int)로 변환하여 반환한다. 단, 오버플로우 혹은 언더플로우가 발생할 경우 예외(java.lang.ArithmeticException) 발생 

    728x90
    반응형

    'Java' 카테고리의 다른 글

    Java 래퍼 클래스(Wrapper Class)  (0) 2024.02.26
    Java 클래스  (0) 2024.02.26
    Java java.lang - 2, String 클래스  (1) 2024.02.25
    Java java.lang - 1, Object 클래스  (1) 2024.02.25
    Java 예외 처리  (1) 2024.02.25
Designed by Tistory.