間違っていないと思います(clock()
は処理系依存のようなので多少の誤差はあるとおもいますが)。
計算は一瞬で終わっているので、1/100秒以内で計算が終わっていると思います。
C
1 printf("%.2f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
ここを
C
1 printf("%f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
こんな感じに変更して再実行するとわかりますが、一瞬で計算が終わっています。
初期値を相当大きくしても1/100秒以上かかることはなさそうです。
追試
いろいろ気になったので、ちょっと自分でも確かめてみました。
ちなみに、実行環境とコンパイラはこんな感じです。
MacBook-Pro t % uname -a
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
MacBook-Pro t % gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin19.3.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
clock()
だとCPU時間しか求まらないし、計算に関係ない時間(おそらくscanf()
の待ち時間も含む)の扱いや、コンパイラで最適化の影響も受けるでしょうから、より実時間に近いclock_gettime()
を使ってみました。
参考文献: man clock_gettime, プログラムの経過実時間をナノ秒単位で出力
変更後のコードはこんな感じ。
現在時刻を得る部分を変更したのと、scanf()
の影響を避けるため、開始時刻の取得場所を変更してみました。
C
1#include<stdio.h>
2#include<time.h>
3#include<math.h>
4
5int main(){
6 double a,b,c,d;
7 int n;
8 struct timespec start, end;
9 n=0;
10
11 double t;
12 long cpu_time;
13
14 printf("初期値は");
15 scanf("%lf",&a);
16 printf("\n");
17
18 // スタート時刻の取得
19 clock_gettime(CLOCK_REALTIME,&start);
20
21 while(1){
22 c=a*a-2;//元の関数
23 d=2*a;//元の関数の微分
24 b=a-c/d;//ニュートン法の計算
25 printf("反復回数:%d\n",n+1);
26 printf("近似解:%lf\n",b);
27 printf("誤差:%lf\n",fabs(b-a));
28
29 if(fabs(b-a)<0.00001){
30 break;//終了条件
31 }
32 a=b;
33 n+=1;
34 printf("\n");
35
36
37 }
38
39 // 終了時刻の取得
40 clock_gettime(CLOCK_REALTIME,&end);
41
42 if(end.tv_nsec < start.tv_nsec){
43 printf("%10ld.%09ld秒かかりました\n",end.tv_sec - start.tv_sec - 1,
44 end.tv_nsec + 1000000000 - start.tv_nsec);
45 } else {
46 printf("%10ld.%09ld秒かかりました\n",end.tv_sec - start.tv_sec,
47 end.tv_nsec - start.tv_nsec);
48 }
49
50 return 0;
51}
実行結果ですが、まずは投稿者さんのコードで実行。
MacBook-Pro t % ./use_clock
初期値は2
(中略)
反復回数:4
近似解:1.414214
誤差:0.000002
0.000094秒かかりました
clock_gettime()
を使うとこんな感じ。
MacBook-Pro t % ./use_clock_gettime
初期値は2
(中略)
反復回数:4
近似解:1.414214
誤差:0.000002
0.000068000秒かかりました
macOSでリアルタイムOSではないので、当然実行ごとに所要時間はかわりますし、その時別に動かしているプロセスの数などでも所要時間がかわりますが、特に何も動かしていない状況だと、1/100秒以下の時間で処理が終わっているようです。
当然、質問者さんが使われているOSなどによっても結果は異なりますし、これ以下の処理時間の時もあると思いますので、詳しい状況がわからないとなんとも言えないのは変わりません。