• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:整数演算と実数演算の速度が違いのプログラム)

整数演算と実数演算の速度の違いとコンパイラのWarningについて

hashioogiの回答

  • ベストアンサー
  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.1

startとendの差が0なのでそのように判断されたのでしょうか? CPUが速いので200000回の計算はあっという間に終わってしまうのでしょう。 2000000000回にすれば差がでると思いますが…。 それでもだめなら二重ループにして回数を増やすとか…。 でもこの手のテストは最適化の問題だとか、コンパイラのデバグルーティンの挿入だとかの問題が隠されているように思いますから、最初のうちは簡単に確認したら次に進んだ方がいいかも。

yumikoro0324
質問者

お礼

hashioogi先生、 どうもありがとうございました。 Loopを言われた回数に直しました。 とても時間がかかり、心配になりましたが無事に違いがでました。 ありがとうございました。!! ゆみころ★ C:\Practice>831 integer start : Fri Aug 31 16:08:57 2012 integer end: Fri Aug 31 16:08:59 2012 interger process time total : 2.000000(sec Real start : Fri Aug 31 16:08:59 2012 Real end: Fri Aug 31 16:13:26 2012 Real process time total : 267.000000(sec)

関連するQ&A

  • 4桁の英字の3桁目を当てるプログラム

    乱数でとってくる4ケタの英字の3桁目を入力して当てるプログラムを 組もうとしているのですが、コンパイラしてもいまいちうまくいきません。 特に下に書いたプログラムのこの部分が違っていると思い どのように修正したらよいのか指摘していただきたいです。 human=getchar(); if(comp[2]!=human) { ero=1; } よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> int sleep(unsigned long x) { clock_t c1=clock(),c2; do{ if((c2=clock())==(clock_t)-1) { return 0; } }while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); return 1; } int main(void) { int num,val,i,j; char comp[21]; char human; int ero=0; int try_count=0; int seikai=0; clock_t start,end; int num1; char eiji[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; srand(time(NULL)); puts("英字記憶トレーニング"); do{ printf("挑戦するレベル(3~20):"); scanf("%d",&num1); }while(num1<3 || num1>20); printf("%d個の英字を記録しましょう。\n",num1); start=clock(); do{ for(i=0;i<num1;i++) { comp[i]=eiji[rand()%strlen(eiji)]; } comp[num1]='\0'; printf("%s",comp); fflush(stdout); sleep(125*num1); printf("\r%*s\r3番目の英字を入力してください:",num1,""); human=getchar(); if(comp[2]!=human) { ero=1; } if(ero==0) { printf("正解です。\n"); seikai++; } else { printf("\a間違いです。\n"); } try_count++; }while(try_count<2); end=clock(); printf("%d回中%d回成功しました。\n",try_count,seikai); printf("%.1f秒でした。\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }

  • PICマイコンを用いてのシリアル通信で、プログラムのループが2周目になると上手く動作しません。

    PIC16f88を用いて、パソコンとシリアル通信を行いたく、その確認の為以下のプログラムを作成しました。 #include<16f88.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP #device ADC=10 #use delay(clock=20000000) #use fast_io(B) #use rs232(BAUD=9600,XMIT=PIN_B5,RCV=PIN_B2) #include <stdlib.h> void main() { int i; long data,data1,data2; long idata[10]; while(1) { printf("start!!\r\n"); gets(idata); data1 = atol(idata); data2 = data1 + (long)5; printf("入力値 %ld\r\n",data1); printf("計算後 %ld\r\n",data2); if ( 20 > data1){ printf("small\r\n"); } if ( 20 < data1){ printf("big\r\n"); } } } 入力した値、入力値に+5した値、また入力値をif文での条件で判別できるかを確認しています。実行結果は以下になりました(ハイパーターミナル上の結果を載せます)。 START!! 9     ←(これは入力した値です) 入力値9 計算後14 small START!! 15 入力値0 計算後5 small START!! 1 入力値0 計算後5 small ・ ・ ・ と、一回目のループは設計通りの動作が行えましたが、2回目のループ以降、何を入力しても”0”が返ってきてしまいます。問題点や改善点がわかる方、よろしくお願いします。

  • 1から入力された数までの素因数を数えるプログラム

    こんにちは 1から入力された数(N)までの素因数を数えるプログラムを 作成したいのですが、うまくいきません。 たとえば10と入力すると2と表示されてしまいます。 どこがおかしいのかわかりません。 どなたか教えてください。おねがいします。 N個の配列を用意し、1を入れていき、 素因数でない数の要素には0をいれて、 最終的に1が入っている配列の数を数えて1~Nまでの 素因数の数を数える方法を考えています。 Dim M As Integer Dim N As Integer Dim i As Integer Dim j As Integer Dim sum As Integer Dim L(1000) As Double N = Val(TextBox1) M = N i = 1 Do Until i > N L(i) = 1 i = i + 1 Loop i = 2 Do Until i > M j = i * 2 Do Until j > M L(j) = 0 j = j + 1 Loop i = i + 1 Loop sum = 0 For i = 2 To N If L(i) = 1 Then sum = sum + 1 End If Next i

  • ファイル情報の「月」の値を整数値で取得するには?

    こんにちは。私は30代の男性です。 下記のサイトに載っていたコーディングなのですが、 http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide93-1.html 「ctime(&filestat.st_mtime)」で取得した「Sat Apr 5」の「月」の値を整数で取得する方法を 考えています(例えば、「Sat 4 5」という感じで)。 何かいい方法はないでしょうか?アドバイスを頂けるとありがたいです。 よろしくお願いします。 #include <sys/types.h> /* stat(), struct stat */ #include <sys/stat.h> /* stat(), struct stat */ #include <stdio.h> /* fprintf(), printf() */ #include <errno.h> /* errno */ #include <string.h> /* strerror() */ #include <stdlib.h> /* exit() */ #include <time.h> /* time_t, ctime() */ int main(void) { struct stat filestat; char path[] = "/path/to/file"; time_t dtime; if(stat(path, &filestat) == -1) { fprintf(stderr, "* Error (%d) [stat: %s]\n", errno, strerror(errno)); exit(errno); } printf("Size: %ld\n", (long)filestat.st_size); printf("Last accessed: %ld, %s", filestat.st_atime, ctime(&filestat.st_atime)); printf("Last modified: %ld, %s", filestat.st_mtime, ctime(&filestat.st_mtime)); dtime = filestat.st_atime - filestat.st_mtime; printf("%ld\n", dtime); exit(0); } 実行例です。 Size: 86555 Last accessed: 1049485323, Sat Apr 5 04:42:03 2003 Last modified: 1049428803, Fri Apr 4 13:00:03 2003 56520

  • 初心者の作ったプログラムの問題点を指摘ください。

    下のように、0から9までの乱数の発生回数の標準偏差を求めるプログラムを組んでみたのですが、最後のシグマの演算が無視されてしまい、0.000000と出力されてしまいます。どこがいけないのでしょうか? #include<stdio.h> #include<time.h> #include<stdlib.h> #include<math.h> int main (void){ int N,i,j,r,a[10]={0,0,0,0,0,0,0,0,0,0}; double S=0; printf("How many trials?;"); scanf("%d",&N); srand((unsigned)time(NULL)); /*初期化*/ for(i=0;i<N;i=i+1) { r=(int)(rand()/(RAND_MAX +1.0)*10); /*乱数N個取得*/ a[r]=a[r]+1; } for(r=0;r<10;r=r+1){ printf("a[%d]=%d.\n",r,a[r]); S=1/10*(S+sqrt((a[r]-N/10)*(a[r]-N/10)));  /*演算(無視されてしまう・・・)*/ } printf("Sigma=%f",&S); return 0; }

  • c言語でcsvファイルの処理で、処理速度が速いプログラムを書こうと思っ

    c言語でcsvファイルの処理で、処理速度が速いプログラムを書こうと思っています。 以下のようなcsvファイル、件数は約10000000件以上あるものを使います shop,ymd,gend,age,area,amt 20,2008-05-01,3,5,014,128 22,2008-05-01,2,4,015,350 : 二列目の日別、つまりymd別に最後列のamdの小計を出したいんですが、組んだプログラムを実行してみると、セグメンテーション違反ですと出てしまうんです。以下のようなプログラムを組んだんですが #include <stdio.h> #include <string.h> #include <time.h> #define MM 256 int main() { FILE *fp; char str[MM],*p1, *p2,*ymd; int num, sum; clock_t start,end; start = clock(); fp = fopen("csv.csv","r"); if(fp == NULL){ printf("ファイルが開けませんでした。\n"); return(0); } sum = 0; fgets(str, sizeof(str), fp); while(fgets(str, sizeof(str), fp) != NULL){ p1 = strtok(str, ","); p1 = strtok( NULL,","); ymd = p1; p2 = strrchr(str,','); sum[ymd] = atoi(p2+1); break; } while( fgets(str, sizeof(str), fp) != NULL && p1 != NULL){ p1 = strtok(str, ","); p1 = strtok( NULL,","); p2 = strrchr(str,','); if ( p2 != NULL ) { if(ymd == p1){ sum[ymd] += atoi(p2+1); }else{ printf("%s ,%d \n",ymd,sum[ymd]); strcpy(ymd,p1); } } } printf("%s ,%d \n",p1,sum); fclose(fp); end=clock(); printf("%.2f秒\n",(double)(end-start)/CLOCKS_PER_SEC); return(0); } うまくいきません。大体、処理速度は3秒以内を目指しています。 どなたかご教授御願いいたします。

  • C言語でこのプログラムを完成させるには

    C言語でこのプログラムを完成させるには C言語初心者です。 1~6の乱数を100回発生させて、それぞれの出現回数をカウントし、ヒストグラムとして表示するプログラムを作成したいのですが上手くいきません。 #include <stdio.h> #include <time.h> #include <stdlib.h> int rnd(int m, int n) { return (int)(n-m+1)*(rand()/(RAND_MAX+0.1))+m; } int main(void) { int i, j, r; int hist[7]; for (i=1; i<7; i++) hist[i]=0; srand((unsigned)time(NULL)); for (i=0; i<100; i++) { r=6; while (6-- > 0) putchar('*'); putchar('\n'); } for (i=1; i<7; i++) { printf("%2d:", i); for (j=0; j<hist[i]; j++) printf("*"); printf("\n"); } return 0; } 何がいけないのでしょうか? よろしくお願いします。

  • 下記プログラムについてご教授をお願いいたします

    お世話になります。 すいません。下記のプログラムにおいてお聞きしたいことがあります。(プログラムの記述の順は無視してください。) void int_tim_b1(void)がタイマーによって10ms毎に呼ばれ、void control_pid(void)の 関数処理が始まり、float TBL_target(float sec, tbl_target *tbl)にテーブル値を引数として 渡すようなのですが、float TBL_target関数において府に落ちない点があります。 例えば、10ms経ち、引数secに0.01が入り、if(sec > tbl[i].time)の条件においてi = 0なので、 tbl[i].time == 0なので、次のif(0 > tbl[i].time)が判定されますが、これは「偽」ですので、 処理はされず、次のelse if(i == 1)もまだi == 0なので、実行されず、elseの中が処理されると 思うのですが、tbl[i-1].target、tbl[i-2].target等の処理は配列の要素の中身が負となってしまうと思うのですが、 違いますでしょうか? 又、else if(i == 1)の処理もtbl[i-1].target == 0となってしまい、次の割り算処理において 「0/0」の0割り処理となってしまう気がいたします。 自分の理解が間違っていると思うのですが、何分わからず、大変困っております。 何卒ご教授のほどよろしくお願いいたします。 typedef struct { float time; float target; } tbl_target; void control_pid(void); float TBL_target(float sec, tbl_target *tbl); const tbl_target tbl_target_angle[ ] = { /* time[sec], target_angle[m/sec] */ 0, 0, 4.99f,       0, 5, PI/2, 10, PI/2, 15, 0, 20, 0, -1, -1, }; #pragma interrupt(INT_TimerB1) void int_tim_b1(void) { IRR2.BIT.IRRTB1 = 0; /* 割り込み要求フラグクリア*/ if(c_start) { control_pid(); c_time += 10; } } void control_pid(void) { theta_ref = TBL_target((float)c_time / 1000, tbl_target_angle); /* 目標値*/ } float TBL_target(float sec, tbl_target *tbl) { int i; float a, b; i = 0; while(1){ if(sec > tbl[i].time){ if(0 > tbl[i].time){ /* -1:テーブル終端の場合 */ if(i == 0){ /* テーブルデータなし */ return 0; } else if(i == 1){ /* 初期値は0として直線補間 */ a = tbl[i-1].target / tbl[i-1].time; b = 0; return a * sec + b; } else{ /* 前2点で直線補間 */ a = (tbl[i-1].target - tbl[i-2].target) / (tbl[i-1].time - tbl[i-2].time); b = tbl[i-1].target - a * tbl[i-1].time; return a * sec + b; } } i++; /* 次のデータへ */ } else if(sec == tbl[i].time){ /* テーブルデータと同じ場合 */ return tbl[i].target; } else{ if(i > 0){ /* 前1点で直線補間 */ a = (tbl[i].target - tbl[i-1].target) / (tbl[i].time - tbl[i-1].time); b = tbl[i].target - a * tbl[i].time; return a * sec + b; } else{ /* 前1点は0として直線補間 */ a = tbl[i].target / tbl[i].time; b = 0; return a * sec + b; } } } }

  • プログラムが動きません。

    プログラムが動きません。 ファイルuniqipにはIPアドレスが書き込まれています。そのファイルからIPアドレスを文字列ipに格納します。 ファイルtmp4には、85.114.143.2 34f4ff4acb18802170a939ae42dcd5ee0eeccda4 のようにIPアドレスとハッシュ値が書き込まれています。 tmp4に現れるIPアドレスで、uniqipに一致するものに対応するハッシュ値を printf("file%d,%s\n",i,hash); の形で出力しようと思いましたが、うまくいきません。 何がまずいのでしょうか? #include <stdio.h> #include <string.h> //ひとつのIPアドレスに現れるユニークなハッシュ値の数をカウントする int main() { FILE *fp,*gp; char ip[269730][16]; char ip2[16]; char hash[42]; int i,j; fp = fopen("uniqip","r"); if(fp == NULL){ printf("can not open the file.\n"); return 1; } for(i=0;i<267930;i++) { fscanf(fp,"%s",ip[i]); //printf("%s\n",ip[i]); } fclose(fp); ////////////////////////////////////////////////////////////////////////////////////////////////////// gp = fopen("tmp4","r"); if(gp == NULL){ printf("can not open the file.\n"); return 1; } for(i=0;i<267930;i++){ for(j=0;j<2470766;j++){ fscanf(gp,"%s %s",ip2,hash); printf("%s\n",ip[i]); if(!strcmp(ip[i],ip2)) { printf("file%d,%s\n",i,hash); } } } return 0; }

  • クイックソートについて

    クイックソートのプログラムなんですが、 セグメンテーション違反で実行出来ません。 どこがおかしいのでしょうか? int main(void) { FILE *fp; int a[10],b=0,n; clock_t start; double jikan; if( (fp = fopen ("quicksort.txt","r") ) == NULL ) { printf("ファイルが見つかりません : quicksort.txt\n"); exit(1); } while( fscanf(fp, "%d", &a[b]) != EOF ) { b++; } start = clock(); quick_sort(a,n); jikan = clock() - start; for(n = 0; n < b ; ++n) { printf("%d ",a[n]); } printf("計算時間 %.3f 秒 \n", jikan/CLOCKS_PER_SEC); return 0; } int partition(int a[], int l, int r) { int i,j,pivot,t; i = l-1; j = r; pivot = a[r]; for(;;) { while( a[++i] < pivot ) ; while( i < --j && pivot < a[j] ) ; if( i >= j ) break; t=a[i]; a[i]=a[j]; a[j]=t; } t=a[i]; a[i]=a[r];a[r]=t; return i; } void quick_sort_1(int a[],int l,int r) { int v; if( l >= r ) return; v = partition( a, l, r); if( l < v-1 ) quick_sort_1( a, l, v-1); if( v+1 < r ) quick_sort_1( a, v+1, r); } void quick_sort(int a[],int n) { quick_sort_1( a, 0, n-1); }