반응형
바빌로니아 법은 임의의 수의 제곱근에 빠르게 수렴하는 수열을 만들어 근삿값을 구하는 방법이다.
이 수열을 계속해서 반복하면 x가 √a가 된다.
먼저 PRECISION_COUNT를 5로 정의하고, 바빌로니아 법을 5번 반복해보자.
printf에 .[Number]f로 옵션을 주면 Number의 자릿수만큼 소수점을 출력할 수 있다.
#include <stdio.h>
#define PRECISION_COUNT (5)
double sqrt(int num)
{
double x = num / 2.0;
for (int i = 0; i < PRECISION_COUNT; i++)
{
x = (x + (num / x)) / 2; /* xn+1 = (xn + (num / xn)) / 2 */
}
return x;
}
int main()
{
printf("%.15f\n", sqrt(2) * sqrt(2));
printf("%.15f\n", sqrt(3) * sqrt(3));
printf("%.15f\n", sqrt(20) * sqrt(20));
printf("%.15f\n", sqrt(99) * sqrt(99));
printf("%.15f\n", sqrt(999) * sqrt(999));
return 0;
}
PRECISION_COUNT를 5에서 10으로 늘리면 조금 더 나은 결과가 나온다.
#define PRECISION_COUNT (10)
하지만 무작정 COUNT를 올릴 수는 없으므로,
원하는 정밀도를 정해서 만족할 때 까지 while문을 이용해 반복하는 방법으로 함수를 바꿀 수 있다.
return되는 X에 대해
X2 - precision < NUMBER < X2 + precision 을 만족한다면 반복을 종료한다.
#include <stdio.h>
//#define PRECISION_COUNT (10)
double sqrt(int num, double precision)
{
double x = num / 2.0;
double x2 = x * x;
double comp_x2 = (double)num;
while (!(comp_x2 - precision < x2 && x2 < comp_x2 + precision))
{
x = (x + (num / x)) / 2;
x2 = x * x;
}
return x;
}
int main()
{
double precision = 0.00000001;
printf("2 : %.15f\n", sqrt(2, precision) * sqrt(2, precision));
printf("3 : %.15f\n", sqrt(3, precision) * sqrt(3, precision));
printf("20 : %.15f\n", sqrt(20, precision) * sqrt(20, precision));
printf("99 : %.15f\n", sqrt(99, precision) * sqrt(99, precision));
printf("999 : %.15f\n", sqrt(999, precision) * sqrt(999, precision));
return 0;
}
모든 결과가 정밀도에 대해 알맞은 제곱근을 구한 것을 알 수 있다.
반응형
'개발 > C, C++' 카테고리의 다른 글
typedef 선언 (0) | 2021.05.02 |
---|---|
C++ 포인터와 참조자 (pointer vs reference) (1) | 2021.05.01 |
C++ ofstream을 이용한 FILE 출력 (0) | 2021.03.18 |
에라토스테네스의 체 - 소수 판단 (0) | 2021.03.16 |
scanf로 문자열과 공백 받기 (0) | 2021.03.16 |
댓글