IEEE 754 - Standard for Binary Floating-Point Arithmetic

개발자 춘식이·2023년 7월 16일
0
post-thumbnail

컴퓨터는 이진법을 사용해서 숫자를 비롯한 모든 데이터를 이진 데이터로 표현하고 처리합니다. 하지만 이 방식으로는 모든 숫자를 정확하게 표현하지 못합니다. 따라서 거의 모든 프로그래밍 언어에서 IEEE 754라는 표준을 따르며, 자바의 float과 double도 이 표준을 따릅니다.
Float은 single-precision 32-bit(32비트 단일 정확도)이며, Double은 double-precision 64-bit(64비트 이중 정확도) 숫자 입니다.
IEEE 754는 부호(sign)부, 지수(exponent)부, 가수(mantissa)부로 나뉩니다.

  • 부호부: 0은 양수를, 1은 음수를 나타냅니다.
  • 지수부: 소수점 이전 숫자열(정수)를 나타냅니다.
  • 가수부: 소수점 이후 숫자열(소수) 전체를 나타냅니다.

single precision
Float은 부호 1자리 + 지수 8자리 + 가수 23자리 총 32비트를 나타냅니다.
double precision
Double은 부호 1자리 + 지수 11자리 + 가수 52자리 총 64비트는 나타냅니다.

예를 들어 263.3 이라는 숫자가 있다고 가정해봅시다.
263.3
정수 263을 이진수로 변환하려면 2로 계속 나누어 나머지를 위에서부터 위로 적어주면 되는데, 결과값은 100000111이 나옵니다.
소수 0.7을 이진수로 변환하려면 2를 반복해서 곱해주면서 그 결과가 1이 나오거나 반복되는 숫자가 나올 때 까지 진행해주면 됩니다. 0.7은 0011이 반복해서 나왔으며 결과값은 010011001100110011... 이 나옵니다.

263.3 = 100000111.010011001100110011....

single precision 에서는 부호 1자리 + 지수 8자리 + 가수 23자리 총 32비트를 나타냅니다.

x xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx

263.3은 양수이므로 부호는 0이 됩니다.

0 xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx

정규화를 하기 위해 소수점을 왼쪽으로 이동시켜 정수 부분이 1이 되도록 만들어주어야 합니다.

1.00000111010011001100110011.... X 2⁸

소수점을 왼쪽으로 8번 이동시켰으므로 지수부는 8이 됩니다. 지수부 8을 표현하기 위해 bias 127(double에서는 1023)을 더해줍니다. 지수부는 8bit로 256개의 수를 표현할 수 있는데, 음수와 양수 모두를 나타내기 위해 일정한 상수(127)을 더해주어 표현합니다.
8 + 127 = 135로, 135를 다시 이진수로 변환하면 10000111이 나옵니다.

0 10000111 xxxxxxxxxxxxxxxxxxxxxxx

나머지 가수부는 위에서 소수점 뒤 00000111010011001100110011.... 을 23비트까지 잘라줍니다.

0 10000111 00000111010011001100110
0100 0011 1000 0011 1010 0110 0110 0110 -> 32bit

IEEE 754 Converter를 이용한 263.3

위 사진은 IEEE 754 Converter 사이트를 통해 결과값을 얻은 것으로 동일한 결과가 나왔음을 알 수 있습니다. 실제로 입력한 값은 263.3이지만 실제로 float에 저장된 값은 263.29998779296875 이라고 합니다. 따라서 왜 중요한 계산에서는 float이나 double을 지양해야 하는지 알 수 있었습니다.


참고
Chapter 2. The Structure of the Java Virtual Machine
부동소수점 (+ 실수계산 오차가 생기는 이유)
IEEE Standard 754 Floating Point Numbers - GeeksforGeeks
Decimal to IEEE 754 Floating Point Representation
IEEE-754 Floating Point Converter

profile
춘식이를 너무 좋아하는 주니어 백엔드 개발자입니다.

0개의 댓글