본문 바로가기
컴퓨터시스템구조

[컴퓨터시스템구조] 17. 부동 소수점

by 파스텔코랄 2023. 10. 15.

부동 소수점(Floating Point)

  • 정수가 아닌 표현
    • 매우 작은 숫자와 매우 큰 숫자
  • 과학적 표기법과 유사
    • 2.34 * 10^56
    • +0.002 * 10^–4
    • +987.02 * 10^9
  • 2진법
    • ±1.xxxxxxx_2 * 2^yyyy
  • C의 float 및 double 유형

 


 

부동 소수점 표준

  • IEEE Std 754-1985에 정의
  • 표현의 다양화에 대응하여 개발됨
    • 과학 코드의 이식성 문제
  • 이제 거의 보편적으로 채택
  • 두 가지 표현
    • Single precision (32비트)
    • Double precision (64비트)

 

 


 

IEEE 부동 소수점 형식

  Sign Exponent(지수) Fraction(가수)
single : 32비트 1비트 8비트 23비트
duoble : 64비트 1비트 11비트 52비트

 

X = (-1)^S * (1+Fraction) * 2^(Exponent - Bias)

 

  • S: sign bit, 부호 비트
    • 0 : 음수가 아님
    • 1 : 음수
  • 유효함수 정규화 : 1.0 ≤ |유효함수| < 2.0
    • 정규화 이후 소수점 앞의 수는 1
    • 예) 1010.1101 → 1.0101101 * 2^3
  • Fraction(가수) : 정규화 이후 1.xxxx...x일때
    • xxxx...x 부분
    • 뒤는 0으로 채움
    • 예) 1.0101101의 Fraction : 0101101
  • Exponent(지수) : 실제 지수 - (Bias)편향
    • 지수가 부호가 없는지 확인
    • single: bias = 127
    • double: bias = 1023

 


 

Single-Precision 범위

  • 지수 : 00000000 ~ 11111111 (8비트)
  • 가장 작은 값
    • Fraction : 000...00 → significand = 1.0
    • 지수 : 00000001
    • 실제 지수 = 1 - 127 = -126
    • ± 1.0 * 2^-126 ≈ ± 1.2 * 10^-38
  • 가장 큰값
    • Fraction : 111...11 → signficand ≈ 2.0
    • 지수 : 11111110
    • 실제 지수 = 254 - 127 = +127
    • ± 2.0 * 2^+127 ≈ ± 3.4 * 10^+38

 

Double-Precision 범위

  • 지수 : 00000000000 ~ 11111111111 (11비트)
  • 가장 작은 값
    • Fraction : 000…00 → significand = 1.0
    • 지수 : 00000000001
    • 실제 지수 = 1 - 1023 = -1022
    • ± 1.0 * 2^-1022 ≈ ± 2.2 * 10^-308
  • 가장 큰값
    • Fraction : 111…11 → significand ≈ 2.0
    • 지수 : 11111111110
    • 실제 지수 = 2046 - 1023 = +1023
    • ± 2.0 * 2^+1023 ≈ ± 1.8 * 10^+308

 


 

부동 소수점 정밀도

  • 상대 정밀도
  • 모든 소수 비트는 중요합니다.
    • single : 약 2^-23
      • 23 * log_10 2 ≒ 23 * 0.3 ≒ 소수점 이하 6자리 정밀도
    • double : 약 2^-52
      • 52 * log_10 2 ≒ 52 * 0.3 ≒ 소수점 이하 16자리 정밀도

 


 

부동 소수점 예시 1

10진수 → 2진수

  • 예) -0.75
-0.75
= (-1)^1 * 0.11_2
= (-1)^1 * 1.1_2 * 2^-1

 

  • S = 1
  • 1.Fraction = 1.1
    • 1000…00_2
  • Exponent - Bias = -1
    • Exponent = -1 + Bias
    • Single: -1 + 127 = 126 = 01111110_2
    • Double: -1 + 1023 = 1022 = 01111111110_2

 

  • Single: 1 01111110 1000…00
  • Double: 1 01111111110 1000…00

 


 

부동 소수점 예시 2

2진수 → 10진수

  • 예) single precision : 1 10000001 01000…00
S Exponent Fraction
1 10000001 01000…00

 

  • 지수 : 10000001_2 = 129
x = (-1)^1 * 1.01_2 * 2^(129-127)
= -1.01_2 * 2^(2)
= -101_2
= -5.0

 


 

비정규 숫자

  • 지수 = 000...0 → 숨겨진 비트는 0
x = (-1)^S * (0+Fraction) * 2^(-Bias)
single : (-1)^S * (0+Fraction) * 2^(-127)
double : (-1)^S * (0+Fraction) * 2^(-1023)
  • 일반 숫자보다 작음
    • 정밀도가 감소하면서 점진적인 언더플로우를 허용한다.

 

  • Fraction = 000...0
x = (-1)^S * (0+0) * 2^(-Bias) = ± 0.0

 


 

무한대와 NaN

  • 지수 = 111...1, Fraction = 000...0
    • ±무한대
    • 후속 계산에 사용할 수 있어 오버플로 검사가 필요하지 않다.
  • 지수 = 111...1, Fraction ≠ 000...0
    • 숫자 없음(NaN)
    • 정의되지 않은 결과를 나타낸다.
    • 예: 0.0 / 0.0
    • 후속 계산에 사용할 수 있다.

 


 

부동 소수점 덧셈

9.999 * 10^1 + 1.610 * 10^-1

 

  • 1. 소수점 정렬
    • 큰 지수에 맞춘다.
9.999 * 10^1 + 0.016 * 10^1

 

  • 2. 유효 숫자를 더한다.
9.999 * 10^1 + 0.016 * 10^1 = 10.015 * 10^1

 

  • 3. 결과 정규화, 오버플로우/언더플로우 확인
1.0015 * 10^2

 

  • 4. 필요한 경우 반올림하고 다시 정규화한다.
1.002 * 10^2

 

부동 소수점 덧셈 2진수 예제

1.000_2 * 2^-1 + -1.110_2 * 2^-2
  • (0.5 + -0.4375)

 

  • 1. 소수점 정렬
    • 큰 지수에 맞춘다.
1.000_2 * 2^-1 + -0.111_2 * 2^-1

 

  • 2. 유효 숫자를 더한다.
1.000_2 * 2^-1 + -0.111_2 * 2^-1 = 0.001_2 * 2^-1

 

  • 3. 결과 정규화, 오버플로우/언더플로우 확인
1.000_2 * 2^-4
  • 오버/언더플로우 없음

 

  • 4. 필요한 경우 반올림하고 다시 정규화한다.
1.000_2 * 2^-4
  • 변화 없음
  • 0.0625

 


 

부동소수점 가산기 하드웨어

  • 정수 가산기보다 훨씬 더 복잡하다.
  • 한 클럭 주기로 수행하면 시간이 너무 오래 걸린다.
    • 정수 연산보다 훨씬 길다
    • 시계가 느려지면 모든 명령에 불이익이 발생한다.
  • 부동소수 가산기는 일반적으로 여러 사이클이 소요된다.
    • 파이프라인 가능

 


 

부동 소수점 곱셈

1.110 * 10^10 * 9.200 * 10^-5

 

  • 1. 지수 더하기
    • 편향된(Biased) 지수의 경우 합계에서 편향을 뺀다.
새 지수 = 10 + -5 = 5

 

  • 2. 유효숫자 곱하기
1.110 * 9.200 = 10.212
10.212 * 10^5

 

  • 3. 결과 정규화, 오버플로우/언더플로우 확인
1.0212 * 10^6

 

  • 4. 필요한 경우 반올림하고 다시 정규화한다.
1.021 * 10^6

 

  • 5. 피연산자의 부호로부터 결과의 부호를 결정한다.
+1.021 * 10^6

 

부동 소수점 곱셈 2진수 예제

1.000_2 * 2^(-1) × -1.110_2 * 2^(-2) 
  • (0.5 * -0.4375)

 

  • 1. 지수 추가
Unbiased : -1 + -2 = -3
Biased : -1 + -2 + 127 = 124

 

  • 2. 유효숫자 곱하기
1.000_2 * 1.110_2 = 1.110_2
1.110_2 * 2^-3

 

  • 3. 결과 정규화 및 오버플로우/언더플로우 확인
1.110_2 * 2^–3
  • (변화 없음), 오버/언더플로우 없음

 

  • 4. 필요한 경우 반올림하고 다시 정규화한다.
1.110_2 * 2^–3
  • (변화 없음)

 

  • 5. 부호 결정
-1.110_2 * 2^-3 = -0.21875

 


 

부동소수점 산술 하드웨어

  • 부동소수점 multiplier는 부동소수점 가산기와 비슷하다.
    • 그러나 가산기 대신 유효숫자에 multiplier를 사용한다.
  • 부동소수점 산술 하드웨어는 일반적으로
    • 덧셈, 뺄셈, 곱셈, 나눗셈, 역수, 제곱근
    • 부동소수점 ↔ 정수 변환
  • 작업에는 일반적으로 여러 주기가 소요된다.
    • 파이프라인 가능

댓글