CHANGEL
SOLID BASICS
CHANGEL

공지사항

  • DEV.CHANGEL PROFILE
  • SOLID BASIC (289)
    • 공부 STUDY (115)
      • JAVA (57)
      • C | C++ (34)
      • CS (11)
      • MySQL (2)
      • ALGORITHM (1)
      • HTML (2)
      • CSS (2)
      • JS (2)
      • CODING (0)
      • MINI PROJECT (3)
    • 스프링 SPRING (21)
      • [SPRING] 김영한 스프링 입문 (11)
      • [SPRING] 남궁성 스프링의 정석 (1)
      • [SPRING] 스프링 핵심원리 (9)
    • 전공 수업 CS (65)
      • Computer Network (13)
      • algorithms (21)
      • Computer Architecture (7)
      • Software Engineering (4)
      • Data Structure (2)
      • DataBase (1)
      • Digital Engineering (14)
      • Discrete Mathematics (3)
      • Introduction to programming (0)
      • Mobile Software (0)
      • Intelligence and Informatio.. (0)
    • 대외활동 (35)
      • 신한은행 대학생 홍보대사 34기 (8)
      • SKT T프렌즈 5기 (13)
      • SK DEVOTION YOUNG 1기 (9)
      • 성균관 대학교 공학교육혁신센터 수강 (3)
      • 수상 기록 (1)
    • 솝트 33기 안드로이드 (7)
      • [솝트 33기] 회고록 (0)
      • [솝트 33기] 안드로이드 왕초보 스터디 (2)
      • [솝트 33기] 코틀린 스터디 (0)
      • [솝트 33기] Git을 털어보자 깃털 스터디 (4)
    • 멋쟁이사자처럼 11기 (6)
      • 멋사 회고록 (4)
      • 백엔드 세션 (1)
      • 기획 세션 (1)
      • 연합해커톤 운영단 (기획팀) (0)
    • 백준 BAEKJOON (16)
    • 독서 BOOK (10)
    • 자격증 CERTIFICATE (1)
    • 준비 서류 및 회고록 MEMOIR (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

최근 댓글

인기 글

CHANGEL

SOLID BASICS

전공 수업 CS/Computer Architecture

[컴퓨터 구조] 실수 표현 - 실수 표현 | 단일 정밀도 부동 소수점 | 지수, 바이어스 값 |IEEE 754

2022. 9. 22. 23:51
공부하다가 이해가 안 가서 한참 들여다본 단일 정밀도 부동소수점... 정규화된 표현
지수 - 바이어스 값 부분이다.
왜 바이어스 값을 이용하며, 바이어스 값이 왜 127인지  컴퓨터 구조 전공 서적만으로는 이해가 되지 않아
아래 글을 보며 차근차근 이해했다. 또 찾아보게 될 수 있으니 정리해두고자 한다.
 

=============================================================

 
float의 경우는 지수의 비트수가 8비트입니다.
 
그렇다면 표현 가능한 수는 256가지 이지요 (0 ~ 255)
 
ieee754 표현법을 아신다니 간략히 말씀 드리지요

 

5.625를 실수로 표현하면 
 
이진수로 바꾸니까 101.101 이 됩니다.
 
이걸 1.xxx 형식으로 정규화 하니까
 
+1.01101 * 2^2 이 되지요 (^는 제곱을 의미합니다)
 
부호(sign)은 양수이므로 부호비트 1비트는 0이 됩니다.
 
이때, 가수(mantissa)는 1.xxx에서 어차피 1인것 아니까 1은 버리고
 
xxx만 즉, 01101 만을 저장합니다. 고로 가수는 01101 입니다.
 
자, 지수만 저장하면 되지요
 
그런데 잘 보시면 float의 부호(sign)비트는 전체 실수의 값이 양수인지 음수인지를
 
의미하는 것입니다.
 
그런데 실수를 1.xxx로 정규화 하다보면 소숫점 이동이 어디로 가느냐에 따라서
 
이 지수가 양의 승수일 수도 있고 음의 승수일수도 있게 됩니다.
 
즉, 이진수로 0.000101 을 정규화 하면 1.01 * 2^-4 가 되지요
 
즉, 지수가 음수로 -4가 나오게 되는 겁니다.
 
그러므로 8비트짜리 지수 저장 공간에 음수와 양수를 저장해야 하니까
 
excess-127 code를 사용한 겁니다. 즉, 지수에 바이어스 127을 더하여
 
0승은 127, 1승은 128 ... 역으로 음의 지수는 -1승은 126, -2승은 125 ... 로 만든겁니다.
 
즉, 127은 0 ~ 255 까지 표현 가능한 지수를 절반에 해당하는 수로
 
지수값의 절반을 양의 지수로 절반의 음의 지수로 사용하고자 절반에
 
해당하는 127을 bias로 설정한 것입니다.
 
이렇게 되다보니 양의 지수는 8비트 지수에서 최상위 비트가 1이되는 값이 되고
 
음의 지수 혹은 0의 지수는 최상위 비트가 0이 되는 값을 갖게 됩니다.
 
결론은
 
바이어스가 127인 이유는 음의 지수와 양의 지수를 절반 씩 표현하기 위하여
 
선택한 숫자이지요 지수가 음인 경우도 필요하니까...
 
double은 지수가 12비트 입니다. 0 ~ 2047까지 표현 가능한데
 
이 경우 바이어스는 1023으로 됩니다.
 
혹시 이 대답을 원하신것이 아니라면
 
좀더 명확한 질문 부탁드릴께요 ^^
 
도움되시길...
 
 
 
 
======================================================================================================

 

 

부동소수점의 표현은 float, double, long double 등의

표현 방법이 조금씩 다릅니다. 하지만 기본은 같으니 일단

float형을 기준으로 설명합니다.

(계산하기 귀찮아서 “C로 배우는 알고리즘” 의 책에서 예를 인용합니다.)

 

float 형은 32bit로 구성되며 부호부(signed bit),

지수부(exponent part), 가수부(fraction part 또는 Mantissa) 로

이루어져 있습니다.

 

예에서, ( 이 예는 계산하기 너무 힘듦… )

 

0 10000101 00000000000000010101101

 

첫 번째 1 bit가 부호부,

두 번째 8 bit가 지수부,

뒤의 23 bit가 가수부입니다.

 

부호부는 0이면 +, 1 이면 – 입니다.

 

지수부는 그 자체가 지수부의 값이 아니라 이 수치에서 bias 값을 빼 주어야

그 값이 나옵니다. 일반적으로 float에서 bias의 값은 127 입니다.

 

가수부는 가장 좌측의 값이 20 를, 그 다음이 2-1, 그 다음은 2-2, … 입니다.

 

지수부를 e, bias를 b, 가수부를 m 이라고 한다면 그 값은

 

m x 2(e-b)

 

가 됩니다.

 

예를 들어 1/16 = 0.0625 를 실수로 표현해 보면

 

0 01111111 00001000000000000000000 = 1/16 x 2(127-127)

0 01111110 00010000000000000000000 = 1/8 x 2(126-127)

0 01111101 00100000000000000000000 = 1/4 x 2(125-127)

0 01111100 01000000000000000000000 = 1/2 x 2(124-127)

0 01111011 10000000000000000000000 = 1/1 x 2(123-127)

 

등 여러 가지 표현이 있을 수 있는데 기준을 정한 것이 가수부의 최좌측 비트는 무조건

1~2의 값으로 만듭니다. 그런데 최좌측 비트가 무조건 1이라면 굳이 1을 쓰지 않아도

되니 1을 생략해서 표현합니다.

 

여기까지 입니다.

 

이제 진짜 예를 들어 보겠습니다.

 

0 10000000 10000000000000000000000

 

이라는 값이 있다면

 

가수부는 앞에 1이 생략되어 있으므로 실제로는 11 이므로

1 x 20 + 1 x 2-1 = 3/2 = 1.5 가 되고

지수부는 2(128-127) = 2 이므로

 

최종적으로 1.5 x 2 = 3 이라는 수가 됩니다.

 

예를 하나 더 들어 볼까요?

 

1 01111110 00000000000000000000000

 

는 어떤 값이 됩니까?

 

가수부는 1 (생략되어 있다고 했죠.)

지수부는 2(126-127) = 2-1

 

결론은 (-) 1 x 2-1 = -0.5  

 

 

'전공 수업 CS > Computer Architecture' 카테고리의 다른 글

[컴퓨터구조] 주기억장치 DRAM | DRAM의 동작원리  (0) 2022.11.17
[컴퓨터 구조] 카르노맵  (0) 2022.10.12
[컴퓨터 구조] 부동 소수점 & 바이어스 수 biased number 127  (0) 2022.09.23
[컴퓨터 구조] 1의 보수와 2의 보수 표현법 이해  (1) 2022.09.23
[컴퓨터 구조] 정수 표현 | (-0)의 2의 보수가 존재하지 않는 이유  (0) 2022.09.22
    '전공 수업 CS/Computer Architecture' 카테고리의 다른 글
    • [컴퓨터 구조] 카르노맵
    • [컴퓨터 구조] 부동 소수점 & 바이어스 수 biased number 127
    • [컴퓨터 구조] 1의 보수와 2의 보수 표현법 이해
    • [컴퓨터 구조] 정수 표현 | (-0)의 2의 보수가 존재하지 않는 이유
    CHANGEL
    CHANGEL
    NOT GIVING UP | SOLID BASICS

    티스토리툴바