質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

3回答

4123閲覧

C言語におけるclockを使った時間計測

_mini

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/02/25 10:00

編集2020/02/25 10:05

C言語でx^2-2=0をニュートン法で近似的に求めるプログラムを組み、入力は任意の初期値、出力は反復回数、近似値、計算時間というプログラムにおいて、計算時間のみ0.00秒となってしまい値がうまく表示されません。clockを使用して計算時間を表示したいのですが、このコードのどこを治したらいいでしょうか?

#include<stdio.h> #include <time.h> int main(){ double a,b,c,d; int n; clock_t start,end; n=0; double t; long cpu_time; start = clock(); printf("初期値は"); scanf("%lf",&a); printf("\n"); while(1){ c=a*a-2;//元の関数 d=2*a;//元の関数の微分 b=a-c/d;//ニュートン法の計算 printf("反復回数:%d\n",n+1); printf("近似解:%lf\n",b); printf("誤差:%lf\n",fabs(b-a)); if(fabs(b-a)<0.00001){ break;//終了条件 } a=b; n+=1; printf("\n"); } end = clock(); printf("%.2f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2020/02/25 10:04

``` ここにコード ``` のように編集してください。 適切に改行しないとうまくコードブロックに入りません(うまくいくとプレビューで枠が出現します)。
TsukubaDepot

2020/02/25 11:42

処理系は何を使っていますか? コンパイラの名前やバージョン、実行しているOSの名前が分かればもう少し詳しくわかるかもしれません。
guest

回答3

0

やってることは間違ってないと思います。
ただ確認の仕方・質問の仕方がよろしくないかと。
最終的な時間はstartとendで計算しているのだから、まずはstartとendの値がどうなっているのかを確認し情報として載せるべきです。
その結果から聞くべき内容も変わりますよね。
startとendが同じ値であれば、結果は当然0ですが、なぜ同じ値が取れてしまうのかの質問になります。
差がとても小さければこれまた結果として0になるのは明らかですし、処理がとても速いということもわかり、質問するまでもないことがわかります。
差がとても大きく計算結果が0より大きくなるのが明らかな場合、なぜそうならないのかの質問になります。
要は結果だけ見ておかしい→わからない→教えて!、ではなくデバッグしましょうね、というお話。

投稿2020/02/25 23:54

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

間違っていないと思います(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などによっても結果は異なりますし、これ以下の処理時間の時もあると思いますので、詳しい状況がわからないとなんとも言えないのは変わりません。

投稿2020/02/25 10:26

編集2020/02/25 12:46
TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_mini

2020/02/25 10:34

初期値を大きくし、反復回数500回程度になっても計算時間が0秒となってしまいます。
dodox86

2020/02/27 00:59

>質問者さん もしWindows上で実行しているのだとしますと、clock()が使うCLOCKS_PER_SECは1000なので、充分な精度は得られないと思います。 https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/reference/clock?view=vs-2019 Microsoft implements clock_t as a long, a signed 32-bit integer, and the CLOCKS_PER_SEC macro is defined as 1000. 反復回数500回程度では、1ミリ秒未満なのではないでしょうか。お使いのPCのCPU性能が高ければ尚更です。
guest

0

時刻の精度以下の時間しかCPUを使用していないからだと思います。

確認のために、CPUを無駄に消費するような処理を入れてみてください。
for(n=0;n<2147483647;n++) ;とか。

投稿2020/02/25 10:43

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問