回答編集履歴
2
語弊のある部分の修正
answer
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
|
33
33
|
```
|
34
34
|
|
35
|
-
`clock()`だとCPU時間しか求まらないし、計算に関係ない時間(おそらく`scanf()`の待ち時間も含む)や、コンパイラで最適化の影響も受けるでしょうから、より実時間に近い`clock_gettime()`を使ってみました。
|
35
|
+
`clock()`だとCPU時間しか求まらないし、計算に関係ない時間(おそらく`scanf()`の待ち時間も含む)の扱いや、コンパイラで最適化の影響も受けるでしょうから、より実時間に近い`clock_gettime()`を使ってみました。
|
36
36
|
|
37
37
|
参考文献: man clock_gettime, [プログラムの経過実時間をナノ秒単位で出力](https://qiita.com/MuriNishimori/items/9f360c327e756b98f26d)
|
38
38
|
|
1
検証結果を追加
answer
CHANGED
@@ -14,4 +14,108 @@
|
|
14
14
|
|
15
15
|
こんな感じに変更して再実行するとわかりますが、一瞬で計算が終わっています。
|
16
16
|
|
17
|
-
初期値を相当大きくしても1/100秒以上かかることはなさそうです。
|
17
|
+
初期値を相当大きくしても1/100秒以上かかることはなさそうです。
|
18
|
+
|
19
|
+
# 追試
|
20
|
+
|
21
|
+
いろいろ気になったので、ちょっと自分でも確かめてみました。
|
22
|
+
ちなみに、実行環境とコンパイラはこんな感じです。
|
23
|
+
|
24
|
+
```
|
25
|
+
MacBook-Pro t % uname -a
|
26
|
+
Darwin MacBook-Pro.local 19.3.0 Darwin Kernel Version 19.3.0: Thu Jan 9 20:58:23 PST 2020; root:xnu-6153.81.5~1/RELEASE_X86_64 x86_64
|
27
|
+
MacBook-Pro t % gcc -v
|
28
|
+
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
|
29
|
+
Apple clang version 11.0.0 (clang-1100.0.33.17)
|
30
|
+
Target: x86_64-apple-darwin19.3.0
|
31
|
+
Thread model: posix
|
32
|
+
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
|
33
|
+
```
|
34
|
+
|
35
|
+
`clock()`だとCPU時間しか求まらないし、計算に関係ない時間(おそらく`scanf()`の待ち時間も含む)や、コンパイラで最適化の影響も受けるでしょうから、より実時間に近い`clock_gettime()`を使ってみました。
|
36
|
+
|
37
|
+
参考文献: man clock_gettime, [プログラムの経過実時間をナノ秒単位で出力](https://qiita.com/MuriNishimori/items/9f360c327e756b98f26d)
|
38
|
+
|
39
|
+
変更後のコードはこんな感じ。
|
40
|
+
現在時刻を得る部分を変更したのと、`scanf()`の影響を避けるため、開始時刻の取得場所を変更してみました。
|
41
|
+
|
42
|
+
```C
|
43
|
+
#include<stdio.h>
|
44
|
+
#include<time.h>
|
45
|
+
#include<math.h>
|
46
|
+
|
47
|
+
int main(){
|
48
|
+
double a,b,c,d;
|
49
|
+
int n;
|
50
|
+
struct timespec start, end;
|
51
|
+
n=0;
|
52
|
+
|
53
|
+
double t;
|
54
|
+
long cpu_time;
|
55
|
+
|
56
|
+
printf("初期値は");
|
57
|
+
scanf("%lf",&a);
|
58
|
+
printf("\n");
|
59
|
+
|
60
|
+
// スタート時刻の取得
|
61
|
+
clock_gettime(CLOCK_REALTIME,&start);
|
62
|
+
|
63
|
+
while(1){
|
64
|
+
c=a*a-2;//元の関数
|
65
|
+
d=2*a;//元の関数の微分
|
66
|
+
b=a-c/d;//ニュートン法の計算
|
67
|
+
printf("反復回数:%d\n",n+1);
|
68
|
+
printf("近似解:%lf\n",b);
|
69
|
+
printf("誤差:%lf\n",fabs(b-a));
|
70
|
+
|
71
|
+
if(fabs(b-a)<0.00001){
|
72
|
+
break;//終了条件
|
73
|
+
}
|
74
|
+
a=b;
|
75
|
+
n+=1;
|
76
|
+
printf("\n");
|
77
|
+
|
78
|
+
|
79
|
+
}
|
80
|
+
|
81
|
+
// 終了時刻の取得
|
82
|
+
clock_gettime(CLOCK_REALTIME,&end);
|
83
|
+
|
84
|
+
if(end.tv_nsec < start.tv_nsec){
|
85
|
+
printf("%10ld.%09ld秒かかりました\n",end.tv_sec - start.tv_sec - 1,
|
86
|
+
end.tv_nsec + 1000000000 - start.tv_nsec);
|
87
|
+
} else {
|
88
|
+
printf("%10ld.%09ld秒かかりました\n",end.tv_sec - start.tv_sec,
|
89
|
+
end.tv_nsec - start.tv_nsec);
|
90
|
+
}
|
91
|
+
|
92
|
+
return 0;
|
93
|
+
}
|
94
|
+
```
|
95
|
+
実行結果ですが、まずは投稿者さんのコードで実行。
|
96
|
+
|
97
|
+
```
|
98
|
+
MacBook-Pro t % ./use_clock
|
99
|
+
初期値は2
|
100
|
+
(中略)
|
101
|
+
反復回数:4
|
102
|
+
近似解:1.414214
|
103
|
+
誤差:0.000002
|
104
|
+
0.000094秒かかりました
|
105
|
+
```
|
106
|
+
|
107
|
+
`clock_gettime()`を使うとこんな感じ。
|
108
|
+
|
109
|
+
```
|
110
|
+
MacBook-Pro t % ./use_clock_gettime
|
111
|
+
初期値は2
|
112
|
+
(中略)
|
113
|
+
反復回数:4
|
114
|
+
近似解:1.414214
|
115
|
+
誤差:0.000002
|
116
|
+
0.000068000秒かかりました
|
117
|
+
```
|
118
|
+
|
119
|
+
macOSでリアルタイムOSではないので、当然実行ごとに所要時間はかわりますし、その時別に動かしているプロセスの数などでも所要時間がかわりますが、特に何も動かしていない状況だと、1/100秒以下の時間で処理が終わっているようです。
|
120
|
+
|
121
|
+
当然、質問者さんが使われているOSなどによっても結果は異なりますし、これ以下の処理時間の時もあると思いますので、詳しい状況がわからないとなんとも言えないのは変わりません。
|