도서/자바의 신

[도서/자바의 신] 부록 #3 float와 double

yulee_to 2022. 12. 27. 20:32

자바의 신

✔️이 글은 [자바의 신 - 이상민 지음] 도서를 바탕으로 정리한 글입니다. 


부록 1,2는 JDK 설치와 이클립스 설치에 관한 내용으로 따로 포스팅하지 않는다.

 

float는 32비트 단일 정확도, double은 64비트 이중 정확도를 갖는 숫자이다. 

IEEE 754에서 정의한 소수점 숫자의 표준에는 비트 크기 외에도 다음과 같은 표준이 있다.

  • 양수와 음수
  • +0과 -0
  • 양수와 음수의 무한대(infinity)
  • 숫자가 아닌 값 (Not a Number, NaN)

NaN에는 0을 0으로 나누었을 때의 값이 포함되고 Float와 Double에 각각 Float.NaN, Double.NaN으로 선언되어 있다. 

 

s * m * 2^(e-N+1)

s는 부호를 나타내고, m은 1보다 크거나 같고, 2^N보다 작은 정수, e는 -(2^(K-1) -2) 보다 크거나 같고 , 2(K-1) -1보다 작거나 같은 수이다. 

N과 K는 타입에 따라 달라진다.

매개 변수 float float-extended-exponent double double-extended-exponent
N 24 24 53 53
K 8 >= 11 11 >=15
E max +127  >=+1023 +1023 >=+16383
E min -126 <=-1022 -1022 <=-16382

extended-exponent로 정의된 타입들은 보다 큰 숫자를 표현할 순 있지만 정확도가 떨어진다.

 

+0==-0의 결과는 true이다. 반면에 다른 연산은 음수와 양수를 구분해 1.0/0.0은 양의 무한대가 되고, 1.0/-0.0은 음의 무한대가 된다.

NaN의 경우 순서가 정해져 있지 않아 크기를 비교하는 연산을 할 경우 항상 결과가 false가 된다.

 

float와 double의 최대 최소값

타입 최소(Normal 값) 최소 최대
float 2^(-126) 2^(-149) 2-2^(-23) * 2^127
double 2^(-1022) 2^(-1074) 2-2^(-52) *2^1023

Normal값은 positive한 일반 값, 최소값은 0이 아닌 positive한 가장 작은 값을 의미한다.

 

자세한 사항은 Java Language Specification 및 IEEE 754 문서를 참조하길 바란다.

728x90