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

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

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

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

Q&A

解決済

2回答

514閲覧

計算がオーバフローする

kisara11235

総合スコア18

C

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

0グッド

0クリップ

投稿2022/11/09 03:53

編集2022/11/09 04:14

前提

数値の計算がしたい。

実現したいこと

E_1を計算して、すべてのiごとに足し算をして、E_2に格納したい。

発生している問題・エラーメッセージ

値が発散する。発散自体はいいのだが、このあとグラフを書きたいので数値として出てきてほしい。

-0.790979 -0.788650 inf 0.119445 0.000000 0.000000 inf inf 0.790979 0.791865 9.710943 0.11896

0.000 の値が発散するのは織り込み済み。しかし値として出てきてほしい。別に適当に大きい数字を入れても良かったが発散する箇所が三個ほどあることが考えられていたのでそれは避けた。
-0.790 の方は発散する理由がわからない。

+0.790 の方は発散していないのでなにか根本的なミスがあると思う。

該当のソースコード

#include <stdio.h> #include <math.h> #include <stdlib.h> #define N 10https://drive.google.com/file/d/1jJaHsKIgK42Gl0R_LyIVYnXGRDYSD4l8/view?usp=share_link void main() { int n=100; int M=n*N; double delta_k=3.14* 3/ n; double e=-3.5; double siny[M]; double A[N][n]; double E_1[N][n],E_2[N]; double f[N][n]; FILE *fp; FILE* fp_1; fp = fopen("b.txt", "r"); /* 読み込みモードでファイルをオープン */ if(fp == NULL) { printf("ファイルを開くことが出来ませんでした.\n"); return; } if ((fp_1 = fopen("bb.txt", "w")) == NULL) { printf("Cannot open the file\n"); exit(1); } for(int i=0; i<M; i++){ fscanf(fp, "%lf", &(siny[i]) ); /* 1行読む */ } double tmp; for (int i=0; i<M; i++) { for (int j=i+1; j<M ;j++) { if (siny[i] > siny[j]) { tmp = siny[i]; siny[i] = siny[j]; siny[j] = tmp; } } } for (int i=0;i<n;i++){ for(int j=0;j<N;j++){ A[j][i]=siny[j*100+i]; } } for(int i=0;i<n;i++){ for(int j=0;j<N;j++){ E_1[j][i]=((A[j][i]+A[j][i+1])/2+(A[j][i]+A[j][i-1])/2)/2; } } //printf("%7.4lf\n",v[1][0]); for(int j=0;j<N;j++){ for(int i=0;i<n;i++){ E_2[j]+=pow(fabs(E_1[j][i])/delta_k,-1); f[j][i]=pow(fabs(E_1[j][i])/delta_k,-1); } } for(int i=0; i<n; i++) { for(int j=0;j<N;j++){ //fprintf(fp_1, "%2f %lf %lf %lf\n", A[j][i],E_1[j][i],E_2[j],f[j][i]); } } //for(int i=0; i<n; i++) { for(int j=0;j<N;j++){ printf( "%2f \n",E_2[j]); } //} fclose(fp); fclose(fp_1); }

試したこと

実際のファイルです。
https://drive.google.com/file/d/1jJaHsKIgK42Gl0R_LyIVYnXGRDYSD4l8/view?usp=share_link

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

kazto

2022/11/09 04:42

デバッガを使ってデバッグ実行はしていますか?
kisara11235

2022/11/09 04:56

よくわかってないです
kazto

2022/11/09 04:59

では、開発環境(Windows?Mac?)、コンパイラの種別(gcc?VisualStudio?)、バージョンを教えてください。
kisara11235

2022/11/09 05:01

開発環境はmac、コンパイラはgcc(icc)でやっています 今デバッグのやり方がわかったので数値をいちいち見ています。解決できるかは不安ですが、、
kazto

2022/11/09 05:09

数値をいちいち見ていくことが重要です。 こうなるはず、という予想と、実際起きている事象の差異を突き止めることが問題を解決する大きな手掛かりとなります。
kisara11235

2022/11/09 05:13

数値は見ていますがもうちょっとわかんなくなっています
guest

回答2

0

すこしずつ、計算結果をファイルなり標準出力なりに出してみてはいかがでしょうか。

for(int i=0; i<M; i++){ fscanf(fp, "%lf", &(siny[i]) ); /* 1行読む */ } { FILE *debug1; if(debug1 = fopen("debug1.txt", "w")) { for(int i=0; i<M; i++){ fprintf(debug1, "%lf", siny[i] ); } fclose(debug1); } }

投稿2022/11/09 06:42

kazto

総合スコア7196

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

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

0

自己解決

結局、数値上は問題ありませんでしたが計算上異常な数字を取り除くことにしました。

投稿2022/11/09 06:18

kisara11235

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問