ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2. 자바 변수와 자료형 (4) float, double
    자바(Java) 강의 2019. 3. 5. 13:16

    이 포스트에서는 자바 프로그래밍 언어의 기본 자료형인 char, boolean, byte, short, int, long, float, double중에서 실수를 표현 할 수 있는 float, double에 대해 알아보도록 하겠다. 

    예상 독자

    목표

    • 실수를 표현하기 위한 자료형
    • float
    • double

    실수를 표현하기 위한 자료형

     정수형에 대해 이야기 해 보았으니 이제 실수를 표현하는 자료형에 대해 알아 볼 차례이다. 앞선 포스팅에서 계속해서 컴퓨터는 이진값 밖에 이해하지 못한다고 했었다. 그렇다면 이진수로 실수를 표현하기 위해 어떤 방법을 써야 할까? 실수가 정수라면 다행히지만 실수는 정수 뿐만 아니라 소수도 포함한다. 이진수로 소수를 표현하기 위해 어떤 방법을 고안 해 냈을까? 사람들은 이진수로 소수를 표현하기 위해 다양한 방법을 고안 했지만 현재는 IEEE에서 지정한 부동 소수점 표현방식(Floating Point Representation)이 보편적으로 사용된다. 간단히 말하자면 어떤 수를 과학에서 유효숫자를 표현하듯 (예를들어 130 = 1.3 * 10^2) 이진수 또한 사용 가능한 비트를 지수부와 가수부로 나누어 지수부에서는 지수(2^n)를 표현하고 가수부는 말 그대로 x.xxxx부분을 표현하는 것이다. 부동 소수점은 CPU의 FPU(Floating Point Unit)이란 곳에서 해석되고 계산된다. 자세한 설명은 현재 단계에서는 조금 난해 할 수 있으므로 생략하겠다. 지금은 부동 소수점이 어떻게 표현되는지 보다는 이 표현에 어떤 장단점이 있는지 아는게 중요하다. 

    장점은 다른 실수 표현 방식들(예: 고정 소수점)에 의해 실수 표현의 범위가 더 넓다는 것이다. 단점은 32비트 또는 64비트를 쪼개서 쓰므로 표현 할 수 있는 숫자에 한계가 생긴다. 또, 이진수로 소수를 표현하면 이진수의 특성상 표현 할 수 없는 숫자들이 생긴다. 이게 무슨 의미인지는 실습을 하며 알아보도록 하자.

    float

    float은 32비트를 가지고 실수를 표현한다. 아래처럼 소수점뒤에 f를 붙여 이 수는 소수임을 알려야 한다.

    public class Main {
    public static void main(String[] args) {
    float number = 0.1f;
    System.out.println(number);
    }
    } 실행 결과: 0.1

    이제 float형으로 간단한 계산을 해 보자.

    public class Main {
    public static void main(String[] args) {
    float number = 0.001f + 0.001f + 0.0001f;
    System.out.println(number);
    }
    }

    위의 식을 손으로 계산 해 보자. 답이 무엇인가? 0.0021이다. 이제 위의 코드를 실행 해 보자. 답이 어떻게 나오는가?

    실행 결과 :
    0.0021000002

    이것이 바로 부동 소수점의 단점이다. 가수부분을 이진수의 소수로 사용하기 때문에 (1/2, 1/4, 1/8, ...) 표현하지 못하는 소수가 존재하게 되는 것이다. 부동 소수점은 나중에 시스템 아키텍쳐나 시스템 프로그래밍을 공부하며 더 자세하게 이해하면 되니 지금은 문법에 집중하고, 프로그래밍 언어에서 실수 표현에는 제약이 있다는 사실을 알고 있으면 된다.

    double

     double은 64비트를 가지고 실수를 표현한다. 

    public class Main {
    public static void main(String[] args) {
    double number = 0.01;
    System.out.println(number);
    }
    } 실행 결과: 0.01

    float과는 다르에 f를 붙여주지 않아도 소수점을 표현 할 수 있다.  double도 마찬가지로 부동 소수점의 정확성(Precision)문제가 나타나는지 알아보자.

    public class Main {
    public static void main(String[] args) {
    double number = 0.01 + 0.001+ 0.0001;
    System.out.println(number);
    }
    } 실행 결과: 0.011099999999999999

    마찬가지로 메모리가 더 커도 이진수의 특성상 표현하지 못하는 소수가 존재해 계산 결과가 부정확함을 알 수 있다.

    이렇게 정확하지 않은 실수 자료형을 실제 세계에서는 사용 할까? 만약 여러분이 개발하는 프로그램이 e-commerce(온라인 쇼핑몰)이라면 실수 자료형을 거의 사용하지 않을 것이다. 나의 경험상 달러의 경우 예를들어 10.25달러(10달러 25센트)라면 그냥 1025자체를 저장하고 1025를 가지고 계산한다. 그리고 frontend딴에서 유저들에게 보여 줄 때만 뒤에서 두자리에 .을 붙인다. 그렇게 하지 않으면 소수점의 정확성 문제 때문에 돈 계산의 결과값에 오류가 생기기 때문이다. 하지만 머신러닝과 같은 분야에서는 실수 자료형의 정확도가 큰 문제가 되지 않기 때문에 이를 감안하고 사용하기도 한다.

    이번 포스트까지 해서 자바의 기본 자료형에 대해 알아보았다. 다음 포스트에서는 아마도 조건문에 대해서 이야기 할 것 같다. 

    다음 포스트: 3. 자바 조건문 (1) if-else

    댓글

f.software engineer @ All Right Reserved