Skip to content
Snippets Groups Projects
Commit 0888c97a authored by hansuchan's avatar hansuchan
Browse files

step2 readme

parent a8b4d699
No related branches found
No related tags found
No related merge requests found
......@@ -78,6 +78,141 @@ object 파일들을 삭제한다
자동 의존 관계 생성으로 타겟이 어느파일에 의존하고 있는지 표시해주는 역할을 한다.
# Project step2 - long long
### List of functions
| Datatype | Name | Parameters | Description |
| -------- | ------------- | ----------- | ------------------------------------------------------------ |
| fx_s2308 | fx_s2308_sind | fx_s2308 fa | fx_s2308로 표현된 fa의 값을 sinTable 을 이용해 sin값을 반환한다. |
### List of macros
| Macro | Description |
| ----------------------------- | ------------------------------------------------------------ |
| FX32_90, FX_32_180, FX_32_360 | 90, 180, 360˙ 를 고정소수점 변환한 값 |
| FX_S2308_L_MUL(a,b) | a와 b를 곱하고 8비트 오른쪽 쉬프트 연산을 한후 long long 형변환 int형변환 시킨 매크로 |
| FX_S2308_L_MUL2(a,b) | a와 b를 각각 4비트 오른쪽 쉬프트 연산을 한 후 곱셈을 수행하고 long long 형변 int형변환 시킨 매크로 |
| FX_S2308_L_MUL3(a,b) | a와 b를 곱하고 8비트 오른쪽 쉬프트연산을 한 후 int 형변환 시킨 매크로 |
| FX_S2308_L_MUL4(a,b) | a와 b를 각각 4비트 오른쪽 쉬프트 연산을 한 후 곱셈을 수행하고 int 형변환 시킨 매크로 |
| FX_S2308_L_DIV1(a,b) | a를 b로 나눈후 8비트 왼쪽 쉬프트 연산을 한 후 long long 형변환 int 형변환 시킨 매크로 |
| FX_S2308_L_DIV2(a,b) | a를 비트 왼쪽 쉬프트 연산을 한 후 b로 나눈 후 int 형변환 시킨 매크로 |
## 성능비교
### 정확도
![mul1](./image/mul1.png)
![mul2](./image/mul2.png)
![mul3](./image/mul3.png)
위의 test결과로 다음과 같은 매크로들의 장단점을 알 수 있다.
- MUL1 : 가장 적은 오차를 가진다. 곱셈 결과를 long long 으로 캐스팅하기때문에 여유 비트수가 많음
- MUL2 : 곱하기 전 쉬프트연산으로 인해 곱셈 전에 이미 데이터가 손실이 될 수 있음
- MUL3 : long long 으로 캐스팅하지 않았기 때문에 데이터의 손실이 많이 발생함(overflow), 큰 수 계산에 부적합하지만 작은수에서는 오히려 오차가 줄어듬
- MUL4 : long long 으로 캐스팅하지 않았기 때문에 데이터의 손실이 많이 발생함(overflow) 큰 수 계산에 부적합
![div1](./image/div1.png)
![div2](./image/div2.png)
![div3](./image/div3.png)
위의 test결과로 다음과 같은 매크로들의 장단점을 알 수 있다.
- DIV1 : 분모가 1보다 작을때 DIV2보다 오차가 적음, 분모가 0.0X일 경우 매우 큰 오차발생
- DIV2 : 분모가 1보다 클때 DIV1 보다 오차가 적음, 분모가 0.0X일 경우 매우 큰 오차발생, 연산 전 쉬프트 연산으로 인해 분자의 입력이 6자리 실수 이상부터 데이터의 손실이 크게 발생할 수 있다.
![sind](./image/sind.png)
TABLE을 이용한 연산으로 원하는 결과값을 얻을 수 있다.
### 속도
### mul
#### 32bit
![32mul1](./image/32mul1.png)
![32mul2](./image/32mul2.png)
#### 64bit
![64mul1](./image/64mul1.png)
![64mul2](./image/64mul2.png)
- 두 환경 모두 double_mul의 성능이 안좋음을 확인할 수 있다 -> long long 의 연산이 double 연산보다 빠름을 알 수 있다.
- longlong_mul 1~4의 결과를 통해 산술연산자가 쉬프트연산자가 느림을 알 수 있고 캐스팅도 성능에 영향을 미치는 것을 알 수 있다. (컴퓨터는 곱셈을 덧셈으로 실행하기에 <<3과 *8은 같은의미지만 속도차이가 난다)
- TEST_NUM은 테스트 횟수로 1000000 일 경우 성능차이를 뚜렷하게 볼 수 있다. 이보다 커질경우 double과 long long의 성능차이가 줄어들게 되며 이보다 작아질 경우 성능이 낮아져 정상적인 테스트가 불가해진다.
- 32bit보다 64bit에서 모든 연산이 같거나 빨라짐을 알 수 있다. 무조건 64bit가 빠르지 않은 이유는 64bit는 32bit로 표현하지 못하는 숫자를 다루기 위함이고 32자리로 표현하는 계산방식에 한계가 있기 때문이다. 그렇기에 큰 숫자를 표현하지 않는 상황에서는 32bit 환경도 무리없이 사용할 수 있다.
### div
#### 32bit
![32div1](./image/32div1.png)
![32div2](./image/32div2.png)
#### 64bit
![64div1](./image/64div1.png)
![64div2](./image/64div2.png)
- 64, 32비트 환경 모두 shift연산을 먼저 적용시키는것 보다 캐스팅후 shift 연산이 빠른 것을 알 수 있음
- 64, 32비트 환경 모두 double형 연산이 느림을 알 수 있음
- 64비트 환경이 32비트환경보다 div2_long long과 div_double가 더 빠름을 알 수 있으며 div2는 같음을 알 수 있다.
### fx_s2809_sind
- sinTable 을 이용해 math 라이브러리 없이 sin값을 계산해주는 함수이다.
- 라이브러리를 사용하지 않기 때문에 퍼포먼스 측면에서 이점이 있다.
```
if ( fa < 0 )
{
sign = -1;
fa *= -1;
}
fa = fa % FX32_360;
if ( fa >= FX32_180 )
{
sign *= -1;
fa -= FX32_180;
}
if ( fa > FX32_90 )
fa = FX32_180 - fa;
```
- 먼저 부호체크를 한 후 360도로 나눈 나머지 각도를 통해 sin 값을 계산하는 코드이다.
```
idx = fa>>8;
ret0 = fx_s2308_SinTable[idx];
diff = fx_s2308_SinTable[idx+1]-ret0;
return ( sign *( ret0 + ((diff*(fa&0x00FF))>>8)));
```
- 고정소수점 값을 이용한 sinTable을 이용해 sin 값을 리턴해주는 코드이다
## Reference
https://t1.daumcdn.net/cfile/tistory/99853D3A5C5190CE09
\ No newline at end of file
image/32div1.png

14.6 KiB

image/32div2.png

21 KiB

image/32mul1.png

6.34 KiB

image/32mul2.png

15.2 KiB

image/64div1.png

12.7 KiB

image/64div2.png

22.6 KiB

image/64mul1.png

5.74 KiB

image/64mul2.png

13.9 KiB

image/div1.png

97.7 KiB

image/div2.png

96 KiB

image/div3.png

100 KiB

image/mul1.png

225 KiB

image/mul2.png

173 KiB

image/mul3.png

150 KiB

image/sind.png

57.4 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment