ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 자바의 정수와 실수의 계산, 부동 소수점 방식
    Java 2023. 7. 17. 10:05
    728x90
    반응형

     

    자바의 정수와 실수의 계산, 부동 소수점 방식

     

    안녕하세용 오늘은 자바 프로그래밍에서 정수와 실수의 계산, 그리고 부동 소수점 방식에 대해 공부했어요. 그렇게 깊게 보지 않은 부분이라서 몰랐던 부분을 기록하고 공유하려고 합니다. 자바에서 정수와 실수를 어떻게 다루고 계산하는지, 또한 부동 소수점 방식이란 무엇인지 알아볼게요 🧐

     

     

     


    🍊 정수 계산 Integer의 한계

    다음 코드의 실행 결과는?

    public static void main(String[] args) {
    	int i1 = Integer.MAX_VALUE;
    	int i2 = i1 + 1;
    	System.out.println(i2);
    }
    
    더보기

    답: overflow가 발생합니다.

     

    overflow

     

     


    🍊 실수 계산

    다음 코드의 실행 결과는?

    public static void main(String[] args) {
    	float f1 = 2.0f;
    	float f2 = 1.1f;
    	float f3 = f1 - f2;
    	System.out.println(f3); // 0.9
    
    	double d1 = 2.0;
    	double d2 = 1.1;
    	double d3 = d1 - d2;
    	System.out.println(d3); // 0.899999999
    
    	System.out.println(( (int)(d1*100) - (int)(d2*100) ) / 100.0);
    
    	BigDecimal b1 = new BigDecimal("2.0");
    	BigDecimal b2 = new BigDecimal("1.1");
    	System.out.println("BigDecimal을 이용한 빼기: " + b1.subtract(b2));
    

     

    더보기

    답.

    0.9

    0.8999999999999999

     

    float에서는 의도한 대로 0.9가 잘 나오지만 double에서는 그렇지 않습니다.

    실수의 연산은 정확하지 않습니다. 따라서 유효 자리수를 이용한 반올림 처리가 필수입니다.

     

    🤷🏻‍♀️ 오차가 발생하는 이유?

    실수 계산에서 오차가 발생하는 이유는 정수와 다르게 실수 계산은 매우 복잡하니다. 컴퓨터가 실수를 계산할 때 사용할 수 있는 방식은 크게 두 가지로 고정 소수점 방식과 부동 소수점 방식 두 가지가 있습니다.

     

     


    📍 고정 소수점 방식

    실수는 보통 정수부와 소수부로 나눌 수 있습니다.

    따라서 실수를 표현하는 가장 간단한 방식은 소수부의 자릿수를 미리 정하여, 고정된 자릿수의 소수를 표현하는 것입니다.

    32비트 실수를 고정 소수점 방식으로 표현하면 다음과 같습니다.

     

    고정 소수점 방식은 정수부와 소수부의 자릿수가 크지 않으므로, 표현할 수 있는 범위가 매우 적다는 단점이 있습니다. 그렇기 때문에 현대 대부분의 시스템에서는 부동 소수점 방식을 채택하고 있습니다.

     

    📍 부동 소수점 방식

    실수는 보통 정수부와 소수부로 나누지만, 가수부와 지수부로 나누어 표현할 수도 있습니다. 부동 소수점 방식은 이렇게 하나의 실수를 가수부와 지수부로 나누어 표현하는 방식입니다.

     

    앞서 살펴본 고정 소수점 방식은 제한된 자릿수로 인해 표현할 수 있는 범위가 매우 작습니다. 하지만 부동 소수점 방식은 다음 수식을 이용하여 매우 큰 실수까지도 표현할 수 있습니다. 32비트의 float형 실수를 IEEE 부동 소수점 방식으로 표현하면 다음과 같습니다.

     

    64비트의 double형 실수를 IEEE 부동 소수점 방식으로 표현하면 다음과 같습니다.

     

     

    이처럼 부동 소수점 방식의 계산은 더 넓은 범위의 계산을 가능하게 하지만 미세한 오차가 있습니다. 위에서 살펴본 실수 계산에서의 오차가 바로 그러한 예입니다.

     

     


     

    🍊 마무리

    컴퓨터에서 실수를 가지고 수행하는 모든 연산에는 언제나 작은 오차가 존재하게 됩니다. 이것은 자바뿐만 아니라 모든 프로그래밍 언어에서 발생하는 기본적인 문제이기 때문에 알아두고 유의할 필요가 있겠죠? 다음에도 유용한 포스팅으로 올게요 👀

     

     

     

     

    참고 자료

     

    코딩교육 티씨피스쿨

    4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

    tcpschool.com

     

    LIST
Designed by Tistory.