No.14568![]() |
高速計算プログラム 投稿者---C言語練習中(2004/06/11 17:05:12) |
||
あるファイルの中に8つの数字(-10000〜10000)が格納されていて それを下のように計算し、新しいファイルに格納するプログラムを作りたいのですが、どのように作ったらよろしいでしょうか? あと、この元データなのですが80万行くらいあるのですが、どうすれば 高速に処理できるかも教えていただけないでしょうか? ---------------------------------- a1 a2 a3 a4 a5 a6 a7 a8 ←空白で分けられている b1 b2 b3 b4 b5 b6 b7 b8 ・ ・ ・ 上を下のように計算し格納していく a1+(a2/60)+(a3/3600),a4+(a5/60)+(a6/3600),a7,a8 b1+(b2/60)+(b3/3600),b4+(b5/60)+(b6/3600),b7,b8 ・ ・ ・ |
No.14570![]() |
Re:高速計算プログラム 投稿者---たいちう(2004/06/11 17:58:11) |
||
高速に計算することが主題ですか? 数字に規則性がある、等の特殊な事情がないならば、 こんな簡単な計算に最適化の余地は殆どないでしょう。 # あまり関係ないかもしれませんが、読み込む数字は整数? # 出力は整数?小数?精度は? プログラム全体で時間がかかるのはファイルの入出力だと 思いますので、複数行(例えば1000行)読み込んでまとめて処理し、 まとめて書き込むようにして、ファイルのアクセス回数を減らすのは 有効だと思います。 高速化の前に1行ずつ処理できるプログラムを確実に作成しましょう。 10行くらいのテストデータを作ってね。 1)1行読み込む。 2)8つの数字に分割する。 3)計算する。 4)書き込む。 5)1)に戻る。 どれかできないことがありますか? |
No.14576![]() |
Re:高速計算プログラム 投稿者---かずま(2004/06/11 22:35:50) |
||
素直に書けば、 double a1, a2, a3, a4, a5, a6, a7, a8; while (fscanf(stdin, "%lf%lf%lf%lf%lf%lf%lf%lf", &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8) == 8) fprintf(stdout, "%.16g,%.16g,%.16g,%.16g\n", a1 + a2*(1.0/60) + a3*(1.0/3600), a4 + a5*(1.0/60) + a6*(1.0/3600), a7, a8); 高速化したければ、ファイルをメモリにマップする。 ただし、Windows と Unix ではやり方が違うので、ここでは概要だけ。 速いかどうかは実際に測定してみないとなんとも言えませんが。 char *p = mem_map(FILENAME); char *end = p + filesize(FILENAME); while (p <end) { a1 = strtod(p, &p); a2 = strtod(p, &p); a3 = strtod(p, &p); printf("%.16g,", a1 + a2*(1.0/60) + a3*(1.0/3600)); a1 = strtod(p, &p); a2 = strtod(p, &p); a3 = strtod(p, &p); printf("%.16g,", a1 + a2*(1.0/60) + a3*(1.0/3600)); a1 = strtod(p, &p); a2 = strtod(p, &p); printf("%.16g,%.16g\n", a1, a2); } |
No.14615![]() |
Re:高速計算プログラム 投稿者---C言語練習中(2004/06/14 11:04:17) |
||
かずまさんのプログラムを元にして。ファイル「〜.dat」を読み込んで処理し「〜.out」というファイルを作ったつもりなんですが、まだ動きません。 どこがおかしいのでしょうか? #include<stdio.h> #include<stdlib.h> main() { FILE *fin,*fout; char filename[256]; char infile[256]; char outfile[256]; float a1, a2, a3, a4, a5, a6, a7, a8; printf("ファイル名入力="); scanf("%s",filename) ; strcpy(infile,filename); strcat(infile,".dat"); strcpy(outfile,filename); strcat(outfile,".out"); if((fin=fopen(infile,"r"))==NULL){ printf("%s is not found.",infile); exit(1); } else printf("%s\n",filename); while (fscanf(fin, "%lf%lf%lf%lf%lf%lf%lf%lf", &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8)) fprintf(fout, "%.16g,%.16g,%.16g,%.16g\n", a1 + a2*(1.0/60) + a3*(1.0/3600), a4 + a5*(1.0/60) + a6*(1.0/3600), a7, a8); if((fout=fopen(outfile,"w"))==NULL){ printf("%s is not found.",outfile); exit(1); } else printf("%s\n",outfile); } |
No.14618![]() |
Re:高速計算プログラム 投稿者---REE(2004/06/14 13:41:26) |
||
>かずまさんのプログラムを元にして。ファイル「〜.dat」を読み込んで処理し「〜.out」というファイルを作ったつもりなんですが、まだ動きません。 >どこがおかしいのでしょうか? プログラムは化けているので見ていませんが、 期待通りに動かないのであれば、どのように期待と違うのか明記してください。 それとも、回答者に確認させたいのですか? |