diff --git a/README.md b/README.md index c34671ed64ee40aea9e3cf74a35caf47b7c4bc89..2adb5f5908a7219baf89291c5e9a5dd6212f5fdd 100644 --- a/README.md +++ b/README.md @@ -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 형변환 시킨 매크로 | + +## 성능비교 + +### 정확도 + + + + + + + + + +위의 test결과로 다음과 같은 매크로들의 장단점을 알 수 있다. + +- MUL1 : 가장 적은 오차를 가진다. 곱셈 결과를 long long 으로 캐스팅하기때문에 여유 비트수가 많음 +- MUL2 : 곱하기 전 쉬프트연산으로 인해 곱셈 전에 이미 데이터가 손실이 될 수 있음 +- MUL3 : long long 으로 캐스팅하지 않았기 때문에 데이터의 손실이 많이 발생함(overflow), 큰 수 계산에 부적합하지만 작은수에서는 오히려 오차가 줄어듬 +- MUL4 : long long 으로 캐스팅하지 않았기 때문에 데이터의 손실이 많이 발생함(overflow) 큰 수 계산에 부적합 + + + + + + + +위의 test결과로 다음과 같은 매크로들의 장단점을 알 수 있다. + +- DIV1 : 분모가 1보다 작을때 DIV2보다 오차가 적음, 분모가 0.0X일 경우 매우 큰 오차발생 +- DIV2 : 분모가 1보다 클때 DIV1 보다 오차가 적음, 분모가 0.0X일 경우 매우 큰 오차발생, 연산 전 쉬프트 연산으로 인해 분자의 입력이 6자리 실수 이상부터 데이터의 손실이 크게 발생할 수 있다. + + + +TABLE을 이용한 연산으로 원하는 결과값을 얻을 수 있다. + +### 속도 + +### mul + +#### 32bit + + + + + +#### 64bit + + + + + +- 두 환경 모두 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 + + + + + +#### 64bit + + + + + +- 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 diff --git a/image/32div1.png b/image/32div1.png new file mode 100644 index 0000000000000000000000000000000000000000..5c255cb0c0b4908341f26bc3e24a40127f0cc8a7 Binary files /dev/null and b/image/32div1.png differ diff --git a/image/32div2.png b/image/32div2.png new file mode 100644 index 0000000000000000000000000000000000000000..10da7a4270409713eb1a2c1d2f7a1141f14a2550 Binary files /dev/null and b/image/32div2.png differ diff --git a/image/32mul1.png b/image/32mul1.png new file mode 100644 index 0000000000000000000000000000000000000000..15d50e14a64c8b8d2ea103852bef7dd246dbb7c1 Binary files /dev/null and b/image/32mul1.png differ diff --git a/image/32mul2.png b/image/32mul2.png new file mode 100644 index 0000000000000000000000000000000000000000..1a61620b2ff06c969ba73254cd06fe839059053f Binary files /dev/null and b/image/32mul2.png differ diff --git a/image/64div1.png b/image/64div1.png new file mode 100644 index 0000000000000000000000000000000000000000..84c9e9bc3b21194e6c5f742eb3aef721644d2ca0 Binary files /dev/null and b/image/64div1.png differ diff --git a/image/64div2.png b/image/64div2.png new file mode 100644 index 0000000000000000000000000000000000000000..ba42ba12a4c22e681b941fa1528d1f3dc9fbf9e8 Binary files /dev/null and b/image/64div2.png differ diff --git a/image/64mul1.png b/image/64mul1.png new file mode 100644 index 0000000000000000000000000000000000000000..ae02147cf33fb2e6b3a1c7a4ab9db6200fafc347 Binary files /dev/null and b/image/64mul1.png differ diff --git a/image/64mul2.png b/image/64mul2.png new file mode 100644 index 0000000000000000000000000000000000000000..febb848c1c730f7f89027044a6bb24fe583b9081 Binary files /dev/null and b/image/64mul2.png differ diff --git a/image/div1.png b/image/div1.png new file mode 100644 index 0000000000000000000000000000000000000000..f7df58b989bb39f52f3878a5b8dc715b58c6c9bb Binary files /dev/null and b/image/div1.png differ diff --git a/image/div2.png b/image/div2.png new file mode 100644 index 0000000000000000000000000000000000000000..311617fcaddfdc9ca51f947ced8baa7ee37ad82d Binary files /dev/null and b/image/div2.png differ diff --git a/image/div3.png b/image/div3.png new file mode 100644 index 0000000000000000000000000000000000000000..a39aff662acbba54356d07f892681e1c87f232ea Binary files /dev/null and b/image/div3.png differ diff --git a/image/mul1.png b/image/mul1.png new file mode 100644 index 0000000000000000000000000000000000000000..d95a4722d1ba760aeebd64ca8e0f0dc372fbd7ca Binary files /dev/null and b/image/mul1.png differ diff --git a/image/mul2.png b/image/mul2.png new file mode 100644 index 0000000000000000000000000000000000000000..afa214835ab48200ae1d10a9328b3008196724c7 Binary files /dev/null and b/image/mul2.png differ diff --git a/image/mul3.png b/image/mul3.png new file mode 100644 index 0000000000000000000000000000000000000000..3d0049860276b40f194372501752ef79dc564808 Binary files /dev/null and b/image/mul3.png differ diff --git a/image/sind.png b/image/sind.png new file mode 100644 index 0000000000000000000000000000000000000000..06e2f2915921b1b0f159d87a53e23a02d34fd4ea Binary files /dev/null and b/image/sind.png differ