- 컴퓨터가 실수를 저장하는 방식: fixed point vs. floating point

 

십진수 실수를 이진수 실수로 표현하는 방식에는 fixed point 방식과 floating point 방식이 있습니다.

 

예를 들어 십진수 +5.5는 fixed point 이진수로 나타내면 +101.1 이고 floating point 이진수로 나타내면 +1.011*(2^2) 입니다.

 

또다른 예로 십진수 -10.25는 fixed point 이진수로 -1010.01 이고 floating point 이진수로 -1.01001*(2^3) 입니다.

 

컴퓨터가 이런 이진수 실수를 저장할 때는 꼭 필요한 정보만을 저장하는데요.

 

fixed point 이진수를 저장할 때는 부호, 정수 부분, 소수 부분 총 3가지를 저장합니다.

 

예를 들어 fixed point 이진수 +101.1의 경우 부호 +, 정수 부분 101, 소수 부분 1을 저장합니다.

 

마찬가지로 fixed point 이진수 -1010.01의 경우 부호 -, 정수 부분 1010, 소수 부분 01이 저장합니다.

 

fixed point 이진수의 정수 부분과 달리 floting point 이진수의 정수 부분은 항상 1이기 때문에 정수 부분의 값을 저장 할 필요가 없습니다.

 

대신 floating point 이진수는 fixed point와는 달리 2^n 값이 곱해지기 때문에 지수 부분 n 값을 저장해주어 야 합니다.

 

따라서 floating point 이진수는 부호, 지수 부분, 소수 부분 총 3가지를 저장합니다.

 

예를 들어 floating point 이진수 +1.011*(2^2)의 경우 부호 +, 지수 부분 2, 소수 부분 011을 저장합니다.

 

마찬가지로 floating point 이진수 -1.01001*(2^3)의 경우 부호 -, 지수 부분 3, 소수 부분 01001을 저장합니다.

 

정리하면 fixed point 이진수와 floating point 이진수는 컴퓨터에서 아래 표와 같이 3부분으로 저장합니다.

 

Signed fixed point format과 unsigned floating point format

 

- bit precision

 

컴퓨터가 저장한 실수 정확도는 컴퓨터가 소수 부분을 저장하기 위해 사용하는 bit 수에 의해 결정됩니다.

 

예를 들어 아래 표와 같이 5자리 이진수 소수부분은 십진수 소수부분 1자리인 0.1~0.9를 정확히 표현 할 수 있지만 십진수 소수부분 2번째 자리 범위인 0.01~0.09은 정확히 표현 할 수 없습니다.

 

이진수 소수부분과 십진수 소수부분 관계

만약 십진수 소수부분 2자리 0.01~0.99 범위의 값을 정확히 표현하고 싶다면 이진수 소수부분 7자리를 사용해야 합니다.

 

이처럼 십진수 소수부분의 정확도는 컴퓨터가 이진수 소수부분을 저장하기 위해 사용하는 bit 사이즈에 영향을 받습니다.

 

컴퓨터 공학에서는 이진수 소수부분을 저장하기 위해 사용하는 bit 사이즈를 bit precision이라고 부릅니다.

 

위의 예시 처럼 이진수 소수부분을 저장하기 위해 5자리를 사용할 경우 bit precision은 5bit가 되고 7자리를 사용할 경우 bit precision은 7bit가 되는 것입니다.

 

이 bit precision N과 표현할 수 있는 십진수 소수부분 자리수 M의 관계를 공식으로 나타내면 아래와 같습니다.

 

M = log(2^N)

 

bit precision 5bit는 공식에 의해 log(2^5) = 1.x 이므로 십진수 1자리를 정확히 표현할 수 있습니다.

 

bit precision 7bit는 공식에 의해 log(2^7) = 2.x 이므로 십진수 2자리를 정확히 표현할 수 있습니다.

 

위의 예시를 통해 볼 수 있듯이 bit precision N값에 따라 표현 할 수 있는 십진수 자리수가 결정되기 때문에 bit precision 이 클수록 십진수를 좀 더 정확히 표현 할 수 있게 됩니다.

- 십진수와 이진수 그리고 정수와 실수

 

우리는 실생활에서 십진수을 사용하지만 컴퓨터는 하드웨어적 특성상 이진수를 사용합니다.

 

정수의 경우에는 우리가 사용하는 십진수와 정확히 일치하는 이진수를 표현할 수 있기 때문에 문제가 되지 않습니다.

 

즉, C에서 int 형 변수는 우리가 사용하는 십진수를 오차 없이 저장 할 수 있습니다.

 

예를 들어 십진수 3은 이진수 101로 변환돼 저장되고 십진수 8은 이진수 1000으로 변환돼 저장됩니다.

 

반면 실수의 경우에는 우리가 사용하는 십진수 값들을 이진수로 정확히 표현하지 못하는 경우가 많습니다.

 

예를 들어 십진수 0.2는 이진수로 정확히 표현 할 수 없고 소수점 아래 5자리(컴퓨터에서는 자리를 bit라고 표현합니다.)를 사용해서 최대한 가깝게 이진수로 표현하면 0.00110으로 표현 할 수 있습니다.

 

즉, C에서 float, double과 값은 실수형 변수들은 십진수 실수값과 최대한 가까운 이진수 실수값으로 저장하게 됩니다.

 

아래 표는 십진수 정수 0~10을 이진수로 변환한 값과, 십진수 실수 0.1~0.9를 이진수 5bit를 사용해서 최대한 가깝게 변환한 값을 나타낸 표입니다.

 

십진수와 이진수의 관계

 

표에서도 확인 할 수 있듯이, 십진수 0.1~0.9는 이진수로 변환되면서 오차가 생기게 됩니다.

 

예를 들어 십진수 0.1은 이진수 0.00011로 변환되고 이 이진수는 십진수 값으로 0.09375이기 때문에 실제 0.1과 차이가 있습니다.

 

이처럼 컴퓨터가 처리하는 이진수 실수 값들은 필연적으로 오차를 수반하게 됩니다.

율전동에 이사온지도 3개월이 넘어가네요.

 

그동안 산책로가 마땅치 않아 주로 성대역 근처를 돌아다녔는데요.

 

오늘 새로운 산책로를 찾아 공유드립니다.

 

청개구리공원과 뜨란채아파트 사이길로 끝까지 올라가면 수원 둘레길 표지판이 보이는데요 누가 알려주지 않는 이상 여기까지 와서 찾기란 쉽지 않아보입니다.

 

율전동 - 덕성산 산책로

 

덕성산 정상까지 왕복 3km가 부족하고요 시간은 50분이내로 걸릴듯 합니다. 

 

사실 이 산책로는 수원 둘레길의 일부분인데요.

 

그래서 산책로 초입에 보면 수원 둘레길 표지판이 보입니다.

 

수원 둘레길 입구 - 송촌 아파트 뒷편

 

수원 둘레길이 궁금하신 분은 아래 링크를 참고해주세요.

 

https://yt.suwon.go.kr/_pcfg/?menuid=sub050104 

 

수원팔색길 - 영통구청

 

yt.suwon.go.kr

 

지도상 덕성산 정상으로 가는 길이라 뭔가 등산처럼 힘든 길이라고 생각하실 수 있는데 사실 경사가 거의 없어 산책로에 가깝습니다.

 

아래는 덕성산 정산까지 가는 길에 찍은 사진 몇장을 올렸습니다.

 

수원 둘레길 초입입니다. 주말농장이 보이고 그 너머에 뜨란채 아파트가 보이네요.

 

수원 둘레길 초입 - 뜨란채 아파트

 

덕성산 정상과 뜨란채 아파트 중간지점에 이정표가 있네요.

 

수원 둘레길 - 덕성산 이정표

 

덕성산 정상입니다. 정자가 있구요 턱걸이 기구를 포함한 간단한 운동기구가 있습니다. 운동하시는 분들, 정자에서 쉬시는 분들이 몇몇 계셨습니다.

 

수원 둘레길 - 덕성산 정산

 

덕성산 정상에 있는 이정표입니다. 이 길이 백운산 까지 연결되나 봅니다. 나중에 시간되면 백운산까지 가보고 싶네요.

 

수원 둘레길 - 덕성산 정상 이정표

- 문제 상황

  • 전원 스위치가 꺼짐 위치에 있는데 이따금씩 스스로 전원이 켜지는 현상
  • 전원 스위치를 이용해 전원을 껐는데 시간이 지난후에 다시 켜지는 현상
  • 해외 직구로 한국 BOSE 대리점 A/S를 이용하지 못하는 상황

- 문제 원인 파악

  • 가정: 전원 스위치의 물리적 문제로 가끔 전원 신호 발생
  • 가정이 맞는지 해드폰 개봉 후 전원 스위치 확인

- 헤드폰 분해 준비물

  • 십자 드라이버, 일자 드라이버

- 헤드폰 분해 순서

  • 분해할 해드폰은 전원 스위치가 있는 오른쪽 헤드폰임을 확인
  • 사진의 화살표처럼 이어패드를 고정하고 있는 부분에 유의하여 이어패드 떼어내기

  • 천 뒤에 나사 3개 풀기

  • 나사를 3개 풀었다면 헤드폰을 뒤집어 헤드폰 뚜껑 열고 회색 전원 스위치 떼기

  • 회색 전원 스위치를 떼면 아래에 쇠로 고정된 검은색 전원 스위치가 나타남
  • 검은색 전원 스위치를 꺼내기 위해서 먼저 쇠를 떼어내야 함
  • 검은색 플라스틱이 살짝 튀어나와 쇠를 고정시키고 있기 때문에 일자 드라이버로 살짝 힘을줘 떼어내야 함

  • 쇠를 떼어내면 검은색 전원 스위치가 스프링에 의해 왼쪽에 고정되어 있는것을 확인 할 수 있음
  • 헤드폰 분해의 목적은 저 검은색 전원 스위치가 문제가 있는지 확인하는 것
  • 검은색 전원 스위치를 떼서 뒤집어 보니 네개의 핀중 하나가 휘어 있었음
  • 전원이 제대로 꺼지기 위해서는 네개의 핀이 모두 정상 접촉되어 있어야 하는데 하나의 핀이 휘어서 접촉 상태가 불량했을 것으로 예상됨

  • 휘은 핀을 원래대로 편 후 전원 스위치 동작 확인

 

  • 이전처럼 전원 스위치 꺼짐 상태에서 전원이 켜지지 않는 것을 확인 후 재조립

- RISC (Reduced Instruction Set Computer)

  • Ex) ARM processor

  • RISC only has basic instructions and this is possible because

  • Most code only requires a few instructions - read/write memory, do arithmetic, jump, boolean logic, not much more.

- CISC (Complex Instruction Set Computer)

  • Ex) x86/x64 processors

  • Although almost all code can be represented by the basic instructions in RISC, certain patterns of instructions are common - for instance, "write this byte to memory then look at the immediately following byte".

  • CISC processors offer combo-instructions (previous example being STOSB) that handle these common instruction patterns super-efficiently.

  • Howerver, support for these combo-instructions requires extra hardware - and that hardware costs electricity.

- Comparision between RISC & CISC with example processor

SoCARM AM3359Atom Z650
# CORES11
CLOCK SPEED720MHz1.2GHz
L1 CACHE64KB56KB
L2 CACHE256KB512KB
POWER CONSUMPTION0.7W3W
  1. Power consumption: RISC < CISC

    • ATOM can consume about 2x the electricity of the ARM processor, even at the same processor clock speed.

    • Because CISC needs bigger hardware than RISC

  2. Program operating speed: RISC < CISC maybe

    • Because a few set of instructions in RSIC can be hadled by one instruction in CISC

- Reference

- C/C++에서 float 형 변수와 double 형 변수의 차이

 

실제 C에서 float 형 변수와 double 형 변수는 실수값을 floating point 이진수 방식으로 저장합니다.

 

즉, float 형 변수와 double 형 변수 모두 실수 값을 저장하기 위해 부호, 지수 부분, 소수 부분을 저장합니다.

 

차이는 float 형 변수와 double 형 변수가 실수값을 저장하기 위해 사용하는 메모리 bit 사이즈에 있습니다.

 

즉, float 형 변수는 실수값을 저장하기 위해 32bit(부호 1bit, 지수 부분 8bit, 소수 부분 23bit)를 사용하고 double 형 변수는 실수값을 저장하기 위해 64bit(부호 1bit, 지수 부분 11bit 소수 부분 52bit)를 사용합니다.

 

이는 구체적으로 두가지 차이로 볼 수 있는데요.

 

먼저 float 형 변수와 double 형 변수의 지수 부분 bit 사이즈의 차이로 인해 저장할 수 있는 실수값의 범위가 달라집니다.

 

float 형 변수와 double 형 변수는 지수 부분을 저장하기 위해 각각 8bit, 11bit를 사용하는데요.

 

float 형 변수는 8bit로 지수부분 -127~128을 표현하는데 사용하고, double 형 변수는 11bit로 -1023~1024를 표현하는데 사용합니다.

 

따라서 float 형 변수는 저장할 수 있는 값의 범위가 대략 -(2^128) ~ +(2^128) 이고

double 형 변수는 저장할 수 있는 값의 범위가 대력 -(2^1024)~+(2^1024) 입니다.

 

다음으로 float 형 변수와 double 형 변수의 소수 부분 bit 사이즈의 차이로 인해 정확히 표현 할 수 있는 실수값의 자리수가 달라집니다.

 

float 형 변수의 경우 생략된 정수부분 1bit와 소수부분 23bit로 인해 bit precision이 24bit이고, double 형 변수의 경우 생략된 정수부분 1bit와 소수부분 52bit로 인해 bit precision이 53bit가 됩니다.

 

따라서 float 형 변수는 log(2^24)=7.x 공식에 따라 십진수 7자리 숫자를 정확히 표현할 수 있고 double 형 변수는 log(2^53)=15.x 공식에 따라 십진수 15자리 숫자를 정확히 표현할 수 있습니다.

 

위의 두가지 차이를 통해서 float 형 변수는 double 형 변수 보다 지수부분 bit 사이즈가 작아서 저장할 수 있는 값의 범위가 더 작고 bit precision이 더 낮아서 저장된 숫자의 정확도가 더 떨어 짐을 알 수 있습니다.

- What is Device driver

Device driver는 Kernel안에서 hardware control을 담당하는 일종의 program이다.

모든 hardware는 자신을 위한 Device driver를 가지고 있고 Kernel은 최대한 다양한 hardware를 다루기 위해서 다양한 Devide driver를 지원한다.

실제로도 Kernel code에서 상당부분이 Device driver code이다.

 

- What is Kernel module?

Kernel module은 Kernel과 따로 build되었지만 run-time에 Kernel에 삽입될 수 있는 program이다.

(이를 위해 insmod라는 program이 지원됨)

 

- Device driver를 배우기전에 Kernel module의 기본 개념을 알아야 하는 이유

Device driver는 Kernel과 함께 build되어 처음부터 Kernel의 일부일 수도 있지만, Kernel module로 만들어져 run-time에 Kernel에 load 될수도 있다.

 

- 'Hello, world' Kernel module 예제

1. 'Hello, world' Kernel module code를 'test.c' 파일에 작성

 

2. Build를 위한 'Makefile' 파일 작성

 

3. Build하여 'test.ko' Kernel module 생성

 

4. 'test.ko' Kernel module을 Kernel에 load 및 load 확인

 

5. 'test.ko' Kernel module을 Kernel에서 제거

 

+ Recent posts