실수의 표현과 연산

컴퓨터에서는 10진수를 표현할 때 보통 Science 표기법을 따름

-2.34 * 10^56 같이 소수 앞자리가 절댓값 1~9 사이여야 함.

따라서 2진수로 실수를 포현하면 정수자리는 항상 1이어야 함.

IEEE 표준 Floating-Point 포맷

제일 첫 비트인 S비트는 sign비트. S가 0이면 양수, 1이면 음수

Fraction: Science 표기법을 따른 실수(에시: -2.34 * 10^56)에서 앞 실수 부분에 1을 뺀 값

Exponent: 지수 부분에 Bias를 더한 값. 32비트는 Bias값이 127, 64비트는 1023

32비트 실수값 범위

00000000과 11111111은 0과 1이므로 제외

가장 작은 값

Exponent: 00000001 → 실제 exponent = -126

Fraction: 000..00 → significand = 1.0

1.0 * 2^-126를 10진수로 변경하면 1.2 * 10^-38

가장 큰 값

Exponent: 11111110 → 실제 exponent = 127

Fraction: 111..11 → significand = 2.0

2.0 * 2^127를 10진수로 변경하면 3.4 * 10^38

64비트 실수값 범위

000…00과 111…11은 0과 1이므로 제외

가장 작은 값

Exponent: 000000000001 → 실제 exponent = -1022

Fraction: 000..00 → significand = 1.0

1.0 * 2^-1022를 10진수로 변경하면 2.2 * 10^-308

가장 큰 값

Exponent: 11111111110 → 실제 exponent = 1023

Fraction: 111..11 → significand = 2.0

2.0 * 2^1023를 10진수로 변경하면 1.8 * 10^308

대략적인 범위는 32비트의 경우 소수점이하 6자리 까지 표현할 수 있고, 64비트의 경우 소수점이하 16자리까지 표현 가능

2진수 → 10진수 실수 변환

32비트인 11000000101000…00을 10진수 실수로 변환하면

S = 1

Fraction = 01000…00

Exponent = 10000001 = 129

(-1) * (1+0.01) * 2^(129-127) = -1 * 1.25 * 2^2 = -5.0

Floating-Point Addition (실수 덧셈)

10진수 덧셈 과정

  1. 자수 맞추기. (큰수 기준)
  2. significand 끼리 더하기.
  3. normalize 하기 & 오버/언더플로우 체크.
  4. 반올림하기 및 필요한 경우 다시 normalize.

예시

4자릿수 실수 계산

9.999 * 10^1 + 1.160 * 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진수 덧셈 과정

과정은 10진수 덧셈과정과 동일

예시

4자릿수 실수 계산

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

  1. 1.000 * 2^-1 + -0.111 \* 2^-1
  2. 1.000 * 2^-1 + -0.111 \* 2^-1 = 0.001 * 2^-1
  3. 1.000 * 2^-4

Floating-Point Multiplication (실수 곱셈)

2진수 양수 * 양수 과정

  1. 지수를 더함
  2. significand끼리 복합
  3. normalize, 오버/언더플로우 체크
  4. 필요에 따라 반올림 및 normalize 수행
  5. sign값 부여

2진수 양수 * 음수 과정

  1. 지수를 더함
    1. unbiased인 경우 지수끼리 덧셈 수행
    2. biased인 경우 bias 값을 더함
  2. significand끼리 복합
  3. normalize, 오버/언더플로우 체크
  4. 필요에 따라 반올림 및 normalize 수행
  5. sign값 부여

'컴퓨터 구조' 카테고리의 다른 글

ALU Control  (0) 2023.07.11
프로세서의 명령어 실행 과정  (0) 2023.07.07
사칙연산 원리  (0) 2023.07.05
Static Linking 부터 로드까지  (0) 2023.06.30
명령어 addressing  (0) 2023.06.30