home..

Cpp02

CPP02에 관한 이야기. 이 시점부터 내가 짜는 모든 클래스들은 Orthodox Canonical Form에 맞춰 짜야 한다.

Table of contents

OCCF란?

OCCF = Orthodox Canonical Class Form.
OCCF는 아래 네 가지의 형태를 명시적으로 정의하여 선언하는 것을 가리킨다.

부동소수점 vs 고정소수점

수학적 개념 중 실수라는 것이 있다. (정수, 유리수, 실수 할 때 그 실수) 보통 분수를 소수점으로 나타낼 때 많이 쓴다. 이 실수를 구현하기 위해 현대 컴퓨터는 부동소수점이라는 표현법을 지원한다. 그러나 부동소수점 실수는 분수를 표현하기 위한 유일한 방법은 아니다. 고정 소수점 계산은 부동 소수점 계산보다 더욱 빠르기 때문에 정확도보다는 성능이 중요한 Digital Signal Processing이나 게임 개발에서 많이 쓰인다.

고정 소수점

고정 소수점은 소수 부분을 표현할 비트의 수를 미리 정해둔 뒤에 10진수를 2진수로 변환한 값을 그대로 비트에 넣어주는 간단한 표현법이다. 우리 과제처럼 소수를 표현할 비트를 8비트로 미리 정해둔 다음, 비트쉬프트를 이용하면 쉽게 고정 소수점으로 실수를 구할 수 있다.

  1. 정수를 고정 소수점으로 변환하는 방법 : 소수부 비트 8개의 공간을 확보해야 되기 때문에 « 연산을 통해 빈 비트 공간을 만들어주면 된다. 즉, 변환하고자 하는 값을 n이라 한다면 n << 8로 바꾸면 된다.
  2. 실수를 고정 소수점으로 변환하는 방법 : 정수와 동일하게 « 연산을 이용해 8비트의 공간을 마련해주어야 한다. float나 double처럼 기존에 이미 부동소수점으로 표현된 실수인 경우, 쉬프트 연산 자체가 불가능하다. 때문에 roundf로 반올림을 해서 만들어준다. 변환하고자 하는 값을 n이라 했을 때, roundf(n * (1 << 8))으로 표현하면 된다.
  3. 고정 소수점을 정수로 변환하려면, n » 8로 원위치 시키면 된다.
  4. 고정 소수점을 실수로 변환하는 것 또한 마찬가지다. 부동소수점을 고정소수점으로 만든 것이었으므로, 고정 소수점을 (float)로 강제 형변환을 시켜 부동 소수점으로 만들어준 뒤, 쉬프트 연산한 값을 되돌려주면 된다. float(n) / (1 << 8) ex01부터 ex02의 허용함수는 라이브러리의 roundf 함수이다.
    이 함수는 `float roundf(float x)`라는 프로토타입을 가지며, float형 변수를 반올림해주는 함수이다.





© 2023 objectio   •  Powered by Soopr   •  Theme  Moonwalk