블로그 이미지
안녕1999

카테고리

전체 (3067)
자바스크립트 (20)
안드로이드 (14)
WebGL (4)
변비 (17)
정치,경제 (35)
C언어,ARM (162)
컴퓨터(PC, Note Book, 윈.. (41)
전자회로, PCB (27)
유머,안웃긴,GIF,동영상 (118)
국부론60 (71)
모듈(PCB) (3)
건강 (2)
FreeCAD (25)
PADS (43)
퇴직,퇴사,구직,취업 활동 (3)
C# (86)
엑셀 (8)
워드 (0)
LabView (6)
레고 (30)
FPGA (0)
Total
Today
Yesterday

달력

« » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

공지사항

최근에 올라온 글

'부동소수점'에 해당되는 글 2건

  1. 2016.09.20 프로그래밍 - 고정소수점 연산
  2. 2016.09.20 프로그래밍 - 실수연산 오차문제

고정소수점 연산은 소수점이 특정위치에 있다고 가정하고, 정수연산을 한 후, 특정위치에 소수점을 찍는 방식이다.


또는 모든 소수점에 특정값을 곱해서, 정수로 만든 후, 연산을 하고, 다시 원래대로 특정값으로 나누는 방식이다.(이 경우에는 오차가 커질 수도 있고, 불필요한 연산이 발생한다)


고정소수점은 q31, q15등의로 표시하는 경우가 많다.

q31은 32비트중 31비트가 소수점이라는 이야기 이다.

이는 최대값을 1.0으로 하여 계산하는 방식이다.

이 방식의 장점은 연산이 쉽다는 것이다.


고정소수점연산의 범위 정하는 방법

1) 부동소수점으로 계산하고, 각 단계별로, 각 변수의 최대, 최소값을 측정한다.

2) 각 단계별로, 해단 변수가 최대, 최소값을 넘어서지 않도록, 소수점 위치를 조정한다.


고정소수점 연산은 대부분 q31과 같이 획일적으로 계산한다.

이 경우, 작은 숫자와, 큰 숫자를 계산할 경우, 오차가 커지는 문제가 있다.

이럴 경우에는 각 단계별로 소수점위치를 조정하여, 더 정밀한 연산을 할 수 도 있다.

물론, 프로그래밍하는데, 더 많은 시간이 들어간다.


또한, 고정소수점의 곱셈이나 나눗셈에서, 두 숫자의 소수점자리를 고려해서, 양쪽의 소수점의 위치를 이동해서 계산하는 트릭도 유효하다.


고정소수점 라이브러리를 잘 작성해 놓으면,

#define 매크로 하나로, 부동소수점으로 바꿀 수 도 있고, 고정소수점연산으로 바꿀 수 도 있다.

이 경우, 모든 연산은 매크로 함수로 표현이 된다.


Posted by 안녕1999
, |

보통 C언어를 사용하여, float, doube등의 실수연산을 할 경우,

오차가 발생한다.


계산기로 간단히 계산하면,

2/3=0.666667

처럼 066666....인 숫자가 666667이 된다.

이값으로 다른 계산에 넣으면, 또 오차가 더 커진다.


대부분, 이작은 오차는 문제가 되지 않으나, 특정 연산에서는 중요한 문제가 된다.


원인은 컴퓨터가 다루는 실수는 이진수를 바탕으로하며, 소수점이하의 이진수는 나타낼 수 없는 값이 존재하기때문이다.


이를 해결하는 방법은 

1) 고정소수점연산을 사용

2) 연산순서를 재배치

    곱셈,덧셈,뺄셈부터 계산후, 마지막에 나눗셈


하는 방법이 있다.

물론, 위 2가지를 같이 사용하면, 더 정확해진다.


부동소수점은 실수표현범위가 넓으나, 정밀도는 떨어진다.

고정소수점은 실수 표현범위가 부동소수점에 비해 매우 좁으나, 정밀도는 부동소수점보다 정확하다.


부동소수점이나 고정소수점이나 모두 오차가 존재한다.

고정소수점이 오차가 비교적 적다.


고정소수점연산에서는 소수점을 몇자리로 할것인지를 결정해야한다.

표현하는 범위를 넘어서는 경우가 발생하면, 전혀 엉뚱한 결과가 나올 수 도 있다.

(부동 소수점은 범위에 상관없이 대부분, 오차는 있어도, 예상되는 결과가 나온다.)


고정소수점연산은 소수점자리를 정하는것이 가장 큰 일이다.


고정소수점연산은 컴퓨터에서 정수연산으로 처리가된다.

마이컴 같은 임베디드 CPU에서는 실수연산 회로가 없어, float, double연산을 하게되면,

에뮬레이션되어, 매우 느려진다.

PC에서는 부동소수점처리장치가 정수연산속도와 비슷하여, 대부분의 경우에는부동소수점으로 계산하는것이 좋다.


마이컴 같은 임베디드 CPU에서는 정수연산만을 사용하는 고정소수점형식으로 연산을 하면, 매우빠른 속도로 실수연산이 가능하다.


Posted by 안녕1999
, |

최근에 달린 댓글

글 보관함