diff --git a/README.md b/README.md index 47272b90a255c7375cf9c7c4f5844a87dbbf8d2b..ce25e4a4dcdb1fafc67aa498458908a00a8e7135 100644 --- a/README.md +++ b/README.md @@ -477,9 +477,10 @@ Index by function name ## 0819 Assignment ### Requirements Specification -* 목적 - -double로 input을 받아서 fx_s1615로 변환하여 사칙연산을 수행한다. +* 목적 +32bit의 fixed point 연산을 구현한다. +double을 사용한 연산과 long long을 사용한 연산을 나누어 구현하며 이 차이를 구분 +할 수 있는 테스트 함수들을 작성하고 분석한다. <br> <br> @@ -487,24 +488,24 @@ double로 input을 받아서 fx_s1615로 변환하여 사칙연산을 수행한 * 제공 기능 -| 매크로 및 함수 이름 | 기능 | 사용에 적합한 범위 | -| ---- | ---- | ---- | -| FX_S1615_ADD(a,b) | fx_s1615로 표현된 두 값을 더해준다. | | -| FX_S1615_SUB(a,b) | fx_s1615로 표현된 두 값을 빼준다. | | -| FX_S1615_MUL(a,b) | fx_s1615로 표현된 두 값을 곱해준다. | | -| FX_S1615_DIV(a,b) | fx_s1615로 표현된 두 값을 나눠준다. | | -| ---- | ---- | ---- | -| fx_s1615 sine_fx_s1615_int(fx_s1615 a) | fx_s1615로 표현된 값의 sine 을 구해준다. | | -| fx_s1615 sqrt_fx_s1615_int(fx_s1615 a) | fx_s1615로 표현된 값의 제곱근을 구해준다. | | -| fx_s1615 power_fx_s1615_int(fx_s1615 a, double n) | fx_s1615로 표현된 값의 n승을 구해준다. | | -| ---- | ---- | ---- | -| FX_1615_LONGLONG_MUL1(a,b) | fx_s1615로 표현된 값을 long long으로 cast 해준 수를 곱한 후, 15만큼 right shifting 해주어 곱셈을 수행한다. | | -| FX_1615_LONGLONG_MUL2(a,b) | fx_s1615로 표현된 값을 곱해주고 15만큼 right shifting해주어 곱셈을 수행한다. | | -| FX_1615_LONGLONG_MUL3(a,b) | fx_s1615로 표현된 값인 a를 8만큼 right shifting 해주고, b를 7만큼 right shifiting 해준 후, 두 값을 곱해주어 곱셈을 수행한다. | | -| ---- | ---- | ---- | -| FX_1615_LONGLONG_DIV01(a,b) | fx_s1615로 표현된 값을 long long으로 cast 해주고, a와 b를 각각 15만큼 right shfiting 하고 a 와 b를 나눠준 후, 15만큼 left shifting 해주어 나눗셈을 수행한다. | | -| FX_1615_LONGLONG_DIV02(a,b) | fx_s1615로 표현된 값을 long long으로 cast 해주고, a를 15만큼 left shfiting 하고 b와 나눠주어 나눗셈을 수행한다. | | -| FX_1615_LONGLONG_DIV03(a,b) | fx_s1615로 표현된 값인 a를 5만큼 left shifting 해주고, b를 6만큼 right shfiting 하고 나눠준 후, 4만큼 left shifting 해주어 나눗셈을 수행한다. | | +| 매크로 및 함수 이름 | 기능 | +| ---- | ---- | +| FX_S1615_ADD(a,b) | fx_s1615로 표현된 두 값을 더해준다. | +| FX_S1615_SUB(a,b) | fx_s1615로 표현된 두 값을 빼준다. | +| FX_S1615_MUL(a,b) | fx_s1615로 표현된 두 값을 곱해준다. | +| FX_S1615_DIV(a,b) | fx_s1615로 표현된 두 값을 나눠준다. | +| ---- | ---- | +| fx_s1615 sine_fx_s1615_int(fx_s1615 a) | fx_s1615로 표현된 값의 sine 을 구해준다. | +| fx_s1615 sqrt_fx_s1615_int(fx_s1615 a) | fx_s1615로 표현된 값의 제곱근을 구해준다. | +| fx_s1615 power_fx_s1615_int(fx_s1615 a, double n) | fx_s1615로 표현된 값의 n승을 구해준다. | +| ---- | ---- | +| FX_1615_LONGLONG_MUL1(a,b) | fx_s1615로 표현된 값을 long long으로 cast 해준 수를 곱한 후, 15만큼 right shifting 해주어 곱셈을 수행한다. 속도는 가장 느리나 정밀도가 가장 높다. 또한 오버플로가 발생하지 않는다. | +| FX_1615_LONGLONG_MUL2(a,b) | fx_s1615로 표현된 값을 곱해주고 15만큼 right shifting해주어 곱셈을 수행한다. 속도는 빠르고 소수부 정밀도 손실 또한 없다. 하지만 정수부가 크면 오버플로의 가능성이 있으므로 절대값이 10 이하인 값의 연산에만 사용할 것을 권장 | +| FX_1615_LONGLONG_MUL3(a,b) | fx_s1615로 표현된 값인 a를 8만큼 right shifting 해주고, b를 7만큼 right shifiting 해준 후, 두 값을 곱해주어 곱셈을 수행한다. 소수부 정밀도에서 약간의 손실이 있으나 준수한 속도를 가지는 함수이다. | +| ---- | ---- | +| FX_1615_LONGLONG_DIV01(a,b) | fx_s1615로 표현된 값을 long long으로 cast 해주고, a와 b를 각각 15만큼 right shfiting 하고 a 와 b를 나눠준 후, 15만큼 left shifting 해주어 나눗셈을 수행한다. 소수부가 대부분 손실 되므로 정수부가 큰 연산에 적합하다. | +| FX_1615_LONGLONG_DIV02(a,b) | fx_s1615로 표현된 값을 long long으로 cast 해주고, a를 15만큼 left shfiting 하고 b와 나눠주어 나눗셈을 수행한다. 연산을 수행해도 손실되는 값이 거의 없어 정밀도가 높다. 32bit 시스템에선 가장 빠르나 64bit 시스템에선 느리다는 단점이 있다. | +| FX_1615_LONGLONG_DIV03(a,b) | fx_s1615로 표현된 값인 a를 5만큼 left shifting 해주고, b를 6만큼 right shfiting 하고 나눠준 후, 4만큼 left shifting 해주어 나눗셈을 수행한다. 약간의 정밀도 손해를 감수하되 시스템에 상관 없이 항상 준수한 속도의 연산을 수행한다. | @@ -513,25 +514,25 @@ double로 input을 받아서 fx_s1615로 변환하여 사칙연산을 수행한 <br> <br> -* 실행 방법 +* 테스트 빌드 및 분석 방법 + - 다음과 같은 순서로 빌드 후 분석한다. + 1. ``make DEFINE=D[macro] PG=-pg`` + 2. ``./test`` + 3. ``gprof test`` -``` -1. ifdef를 이용하여 macro의 정의에 따라 각각 다른 test가 수행되도록 코드를 구성하였다. - [ifdef로 정의된 macro] - (1) MULTIPLE_TIME_TEST : 곱셈을 수행하는 경우, double vs long long 시간 테스트 - (2) DIVISION_TIME_TEST : 나눗셈을 수행하는 경우, double vs long long 시간 테스트 - (3) SIN_PRECISION_TEST : sine table이 알맞은지 확인하기 위해 시험해주는 테스트 - (4) FX_MUL_TEST : scanf로 두개의 숫자를 받았을 때, 정의된 4가지 함수로 곱셈을 수행해주는 테스트 - -->FX_S1615_MUL(a, b), FX_1615_LONGLONG_MUL1(a, b),FX_1615_LONGLONG_MUL2(a, b),FX_1615_LONGLONG_MUL3(a, b) - (5) FX_DIV_TEST : scanf로 두개의 숫자를 받았을 때, 정의된 4가지 함수로 나눗셈을 수행해주는 테스트 - -->FX_S1615_DIV(a, b), FX_1615_LONGLONG_DIV01(a,b),FX_1615_LONGLONG_DIV02(a,b),FX_1615_LONGLONG_DIV03(a,b) - -2. make 수행 - * make CFLAGS=-D[MACRO] - * ./test 로 결과 확인하기 + - 조건부 컴파일을 이용하여 macro의 정의에 따라 다른 test가 수행되도록 코드를 구성하였다. + ``` + [ifdef로 정의된 macro] + (1) MULTIPLE_TIME_TEST : 곱셈을 수행하는 경우, double vs long long 시간 테스트 + (2) DIVISION_TIME_TEST : 나눗셈을 수행하는 경우, double vs long long 시간 테스트 + (3) SIN_PRECISION_TEST : sine table이 알맞은지 확인하기 위해 시험해주는 테스트 + (4) FX_MUL_TEST : scanf로 두개의 숫자를 받았을 때, 정의된 4가지 함수로 곱셈을 수행해주는 테스트 + -->FX_S1615_MUL(a, b), FX_1615_LONGLONG_MUL1(a, b),FX_1615_LONGLONG_MUL2(a, b),FX_1615_LONGLONG_MUL3(a, b) + (5) FX_DIV_TEST : scanf로 두개의 숫자를 받았을 때, 정의된 4가지 함수로 나눗셈을 수행해주는 테스트 + -->FX_S1615_DIV(a, b), FX_1615_LONGLONG_DIV01(a,b),FX_1615_LONGLONG_DIV02(a,b),FX_1615_LONGLONG_DIV03(a,b) + ``` -``` <br> <br>