안녕하세요 성조입니다.
이전에 연구실에서 풀었던 문제를 갖고 왔습니다!
소스코드, 속도 측정한 소스코드, sqrt를 사용한 속도 측정 소스코드로 나눠서 코드에 대해 포스팅하겠습니다.
(개인)접근 방법
1. (1/n) -> 분모는 계속 n+2값을 갖는다.
2. 500,000번 반복한다.
3. +, -, +, -...가 항이 모두 끝날 때까지 반복한다.
조건으로 문제를 풀이했고 다음과 같은 소스코드를 만들었습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <stdio.h>
int main()
{
double pi = 0, num = 1;
printf("\n\t");
for (int i = 1; i <= 500000; i++)
{
if (i % 2 == 0)
pi = pi - (1 / num);
else
pi = pi + (1 / num);
num = num + 2;
}
pi = pi * 4;
printf("%f", pi);
printf("\n");
}
|
cs |
1차 결과적으로 float의 경우 3.141594, double의 경우 3.141591가 나왔습니다.
Google에 나온 Pi 값의 경우 3.1415926... 반올림 시 3.14193이 나옵니다. 본인이 계산한 값과는 차이가 분명하게 나네요
소스코드, 측정한 컴퓨터의 사양, OS(운영체제), 반복 횟수이 4가지 중의 문제가 하나 있을 것이라 판단됩니다.
시간 측정을 포함한 소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include <stdio.h>
#include <time.h>
int main()
{
double pi = 0, num = 1;
printf("\n\t");
for (int i = 1; i <= 500000; i++)
{
if (i % 2 == 0)
pi = pi - (1 / num);
else
pi = pi + (1 / num);
num = num + 2;
}
pi = pi * 4;
printf("%f", pi);
printf("\n");
end = clock();
printf("\t%d ms", end - start);
}
|
cs |
속도 측정 값
1~2 m/s이 반복해서 측정됐습니다.
이후 sqrt 함수를 사용하여 측정된 값과 속도를 구하면 어떨까? 란 의문이 들어 실험해봤습니다.
sqrt 함수를 사용해본 소스코드
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
|
#include <stdio.h>
#include <math.h>
#include <time.h>
int main()
{
double pi = 0, num = 1;
printf("\n\t");
clock_t start, end;
start = clock();
for (int i = 1; i <= sqrt(500000); i++)
{
if (i % 2 == 0)
pi = pi - (1 / num);
else
pi = pi + (1 / num);
num = num + 2;
}
pi = pi * 4;
printf("%f", pi);
printf("\n");
end = clock();
printf("\t%d ms", end - start);
}
|
cs |
sqrt를 코드에 섞어서 작성해봤는데 이번에 측정된 값은 3.14007이 나왔습니다. 위에 언급한 Google의 3.14193값과의 오차가 조금은 줄어든 느낌이네요 하지만 제 소스코드 방식이 올바르지 못한 것인지 여전히 정확하게 Google 과의 4가지 차이점에 대해서 잡아내지 못했네요
항이 50만 번 돌아가는 것을 sqrt 함수를 사용하여 루트를 값에 씌워서 작성했는데 속도가 0~1m/s 만큼 나오는 것을 다음과 같이 확인할 수 있었습니다.
속도적 측면이 sqrt함수를 사용하는 경우 더 빠른 성능을 보여주는 코드가 되었습니다. 소스코드는 코드를 작성하는 사람만의 취향이 있는데 그런 소스코드도 더 효율적이고 성능이 좋은 코드를 구현할 수 있도록 하는 것이 중요하다 생각됩니다.
앞으로 이번 방학(2020.12.19 포스팅하고 있는 이 날짜)에 계절학기를 병행하면서 토익 공부와 자료구조와 알고리즘 코드에 대해서 구현하여 계속 성능 평가를 진행하고 조금 더 정답에 가까운 해답인지 측정하는 과정을 겪을 예정입니다. C언어도 파이썬도 중요한 언어들에 대해서 공부도 진행하고 수학 공부도 착실히 진행하여 더 좋은 포스팅 계속 업로드하겠습니다.
참고로 제 블로그 유입 경로가 데이터 과학을 위한 파이썬 프로그래밍이 90%에 가까울 정도로 많은 조회수를 갖고 있고 많은 분들이 5, 6, 7...장들의 해설을 원하셔서 시간이 나면 개인적으로 문제를 풀이해서 업로드할 예정입니다.
교재가 지금 없고 문제는 갖고 있지만 우선순위가 공부를 하고 싶은 것들이 너무 많았고 부족했던 부분도 너무 많았기 때문에 그 부분들에 대해서 먼저 공부할 것 같습니다. 또한 교재의 부재로 인해서 파이썬 관련 포스팅을 진행하더라도 조금 더 걸리지 않을까 싶어요.. 포스팅에서 간간이 언급을 드렸지만 보는 분들만 보는 것 때문에 관심 없는 분들은 안 보고 지나가시겠죠... ㅎㅎㅎㅎㅎ...
'C, C++ > C' 카테고리의 다른 글
[C언어] 조건을 만족하는 정사각형의 한 변의 길이를 구하는 프로그램 (0) | 2020.12.26 |
---|---|
[C언어] *로 빈 사각형과 빈 공간 다이아몬드 출력하기 (2) | 2020.12.20 |
[C언어] 소수 판별하는 소스코드 (0) | 2020.12.14 |
[C언어] 10, 8, 16, 2진수로 0~255값 출력하기 (2) | 2020.12.11 |
[C언어] 1부터 100까지 정수의 약수를 구하고, 소수와 제곱수, 완전수를 구별하도록 하는 프로그램을 for를 이용하여 작성하라. (0) | 2020.12.10 |