자바에서 실수를 표현하기 위해서는 부동소수점 방식의 자료형을 사용해야 한다.

 

관련 포스트를 보니 부동 소수점 방식이라는 번역이 많은 사람들에게 혼란을 주고 있는 듯 하다.

 

무리도 아니라고 생각한다. 영어로 floating point arithmetic 라는 것은 실수의 연산을 할 때에 소수점을 고정시키지 않고 바다에 둥둥 떠다니는 것처럼 돌아다닐 수 있게 만든 방식이다. 둥둥 떠 다닌다니 벌써부터 난해하다.

 

자바를 시작하는 초기에 모든 것을 다 이해하지 않아도 괜찮다.

 

이번 자바 튜토리얼은 초보자가 읽고 실행해보기 위한 튜토리얼 이다.

 

여기서 부동소수점 방식에 대하여 많은 것을 다루지 않을 것이다.

 

 

* 처음에는 이 정도만 기억하면 된다.

 

- 자바에서 실수를 표현하기 위해서 4바이트 float 와 8바이트 double형을 사용할 수 있다.

 

- float와 double형은 부동소수점 방식을 사용한다.

 

- 부동소수점은 완벽하지 않다.

 

 

정수형에 서는 음수를 표현하기 위해 2의 보수를 사용한다는 내용을 포스팅 했다.

 

이진수: 0000 0011 ... 3

 

이라면

 

이진수: 1111 1101 ... -3 

 

-3은 3의 2의 보수이다. 이것은 정수형 일때의 이야기이다.

 

실수를 사용할 경우 32bit float 형에서는

 

부호비트 1과 지수부 8비트 가수부 23비트를 나눠 사용한다.

 

단정도 부동소수점 방식

 

정수형에 비하여 연산이 복잡하다. 실수는 소수점을 기준으로 나누어진다.

 

이진법에 대하여 지금까지 배운 것들은 소수점 위의 정수에 해당하는 계산이었다.

 

4비트가 있으면

 

십진   8 4 2 1

이진   0 0 0 0

 

이렇게 자리가 정해져있다. 오른쪽에서 왼쪽으로 갈 수록 x2배를 한다.

 

직선에서는 아래와 같은 크기일 것이다.

이진법

그러면 소수점 아래는 어떻게 봐야하는가?

 

우선 십진법을 생각해보자. 0.1(10) 이란 숫자가 있다. 지수는 10의-1승이다. 10분의 1이라는 뜻이다.

 

이진법의 0.1(2)은 무엇인가? 지수는 2의-1승으로 2분의 1이라는 뜻이다. 십진수에서는 0.5인 것이다.

 

0.01(2)은 2의-2승 4분의1이라는 뜻이다. 십진수에서는 0.25인 것이다.

 

이진수 소수점

<예제>

 

십진수 4.5 를 부동소수점 방식으로 변환하시오. (IEEE 754 단정밀도)

 

- 4.5는 소수점을 기준으로 왼쪽은 4 오른쪽은 0.5이다.

 

- 4의 이진수 100(2) 0.5의 이진수 0.1(2) 합치면 100.1(2) 이다

 

- 정규화(소수점 왼쪽은 1이 있는 한자리로 통일) 100.1 -> 1.001 * 2^2 (2^2는 2의2승)

 

- 부호비트: 0, 지수: 1000 0001 (2 + 바이어스 127), 가수: 1.001 에서 1을 제외한 부분. 나머지는 0으로 채움

 (바이어스는 정규화된 1.001 * 2^2 (2^2는 2의2승)에서 지수인 2에 더해주는 숫자이다. 32bit IEEE 754의 규정은 지수에 127을 더한다.)

 

부동소수점 변환(단정밀도)

 

우리가 소스코드에 4.5를 적더라도 float형은 이렇게 계산되어 저장된다.

 

이렇게 하는 이유는 32비트를 나누어 쓰기 때문에 값을 표현할 수 있는 범위가 비약적으로 늘어나기 때문이다.

 

단점은 정밀도의 한계가 있다. 예를 들어 흔히 쓰는 십진수 0.1 는 이진법에서 정확한 표현이 불가능하다. 이진수로 변경시 무한히 반복되는 순환소수로 변한다. 

 

십진수 0.1

32bit IEEE 754 단정밀도로 변환하면

 

1. 부호: + 0

2. 지수: 2^-4 로 -4 + 127 = 123 은 0111 1011

3. 가수: 1 0011 0011 0011 0011 0011 00

 

십진수 0.1은

 

부동소수점 방식 :

0 0111 1011 1 0011 0011 0011 0011 0011 00

 

가 된다. 

 

거꾸로 이진수 0.00011001100110011001100

를 10진수로 변환시키면

0.09999990463256836(계산기 사용) 

이 되는 것 처럼 아무리 많은 비트를 사용해도 차이가 사라지지 않을 것이다.

 

이처럼 완벽할 것 처럼 보이는 컴퓨터에도 실수를 처리하는데 상당한 문제점이 있다.

 

일상생활에서는 지장이 없을지도 모르지만 0.0000... 01의 차이가 중요한 애플리케이션이 있다면 불완전한 부동소수점의 사용은 큰 문제가 될 것이다.

 

자바의 float 형 범위는 다음 사이트의 내용과 같다.

 

https://programming.guide/java/float-range.html

 

Java: Range of a float | Programming.Guide

 

programming.guide

 

마지막으로 자바 float형의 예제다.

 

 

float 키워드로 선언한다. 4 byte IEEE 754 단정밀도 이고 예제를 보면 3.14159265359F 에 마지막에 F가 들어간다. float 형에는 반드시 F 식별자를 사용해야 된다. 자바는 64비트 double이 기본이기 때문에 실수는 F 식별자로 float에 맞도록 변환된다.

 

입력은 3.14159265359F를 했지만 출력된 것은 3.1415927 즉 소수점 아래 7자리에서 반올림되었다. 실수를 입력할때 정밀도의 범위를 벗어나면 오류가 나지 않고 유효한 범위까지만 잘라서 반올림된다.

 

* 부동 소수점의 한계

다음 예제는 부동소수점의 한계를 보여준다.

 

 

double형 변수 sum에 0.01을 100번을 더했다.

 

1.00이 되기를 바란다. 허나...

 

100번째 되는 시점에 끝자리가 7이다. 32비트 float 형보다는 정교하다. 하지만 완벽하지 않다. 

 

앞쪽을 보면 믿기힘들다. 0.01을 10번 더했을 때의 결과가 0.0999... 가 나온다.

 

10번째는 0.099.... 이고 100번째는 1.00 ... 007 이다.

 

그러니까 부동 소수점 방식을 사용할 때는 어떤 목적인지 잘 생각해서 사용할 필요가 있다.

 

소수점 아래 범위는 적지만 정확성이 중요할 때는 정수를 사용할 수도 있다.

 

예를 들어 온라인 쇼핑몰에서 달러 상품을 취급할 때는 1.00 달러에 대하여 정수형을 사용할수 있다. 정확히는 센트 단위로 정수형에 저장하면 1달러는 100센트 이다. frontend 상품정보에서 고객에게 보여주는 부분만 변환해주면 된다.

 

C나 다른 언어도 각자의 방식으로 실수를 다룬다.

 

다음의 영상은 인도 선생님이 floating Point 방식에 대한 설명이다.

 

유튜브에서 가끔 놀라운 강의들을 찾을 때가 있는데 영문이라 그렇지 설명이 아주 좋다. (영어도 기술용어를 알면 충분히 이해할 수 있다)

 

기술 자료중에서 10만 이상 조회수가 있는 영문 컨텐츠는 전세계의 학생들이 봤다는 근거가 될 수 있다. 유사한 내용의 한글 컨텐츠와 숫자를 비교해보면 조회수가 한참 많다. 아무래도 영어권이 IT의 본고장이고 한글 사용자보다 학생숫자도 많으니까.

 

https://www.youtube.com/watch?v=8afbTaA-gOQ&t=2s

최근에는 다른 나라의 대학강의 내용을 듣기 위해서 엄청난 돈과 시간을 들여서 유학을 떠나야 했다. 지금은 영어만 가능하면 웬만한 레퍼런스와 강의는 바로 찾아 들을 수 있다.

 

사실 서점에 가서 찾아도 코딩 입문서에 IEEE 754 를 자세히 설명하는 책은 없다. 그렇게 책을 만들면 초보자들은 어려워서 좀 손이 안가게 된다. 또 지면을 많이 할애해야 하기 때문에 책이 두꺼워지고 재미가 없어진다. 이런 내용은 IT 전공에서 가르치는 내용들이다.

 

나만 해도 서점에서 책을 고를 때 초장부터 어려운 내용이 나오면 좀 더 쉬워보이는 다른 책을 찾는다. 하지만 어쨋든 알아야 하는 내용이면 누군가 설명을 해줘야 한다. 이런 내용을 만들어 공유하는 착한 사람들이 많아서 다행이다.

 

인터넷 자료는 내가 원하는 자료를 찾기까지 여러개를 뒤져야 괜찮은 한개 정도가 나온다고 생각한다. 그 과정이 험난하니까 문제지 기존의 문제라면 어딘가에는 다 있다고 생각한다.

 

부동소수점과 실수 자료형은 다소 지루한 부분이라서 후기를 잡담스럽게 마친다.

공유하기

facebook twitter kakaoTalk kakaostory naver band