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

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

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

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

Q&A

解決済

2回答

19728閲覧

プログラムのエラーの原因がわかりません

jackie687456

総合スコア17

C

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

0グッド

0クリップ

投稿2017/07/21 18:24

###前提・実現したいこと
次のような問題のプログラムで、コンパイルはできるのですが実行するとエラーが出てしまいます。
(cygwinにgccを入れてやっています)

コインを100回投げる試行を行うことを考える。
メトロポリスの方法を使って、二項分布に従うマルコフ過程から10000個分のサンプル列を作成せよ。
ただし、確率変数kとすると、kの次にはk-1かk+1が1/2の確率でそれぞれ選ばれ、0と100はつながっているものとする。

おそらく除算をしているところで不具合が起きているのではないかと考えているのですが・・・。
お手数ですがよろしくお願いいたします。

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

Floating point exception (コアダンプ)

###該当のソースコード

C

1#include<stdio.h> 2#include<math.h> 3#include<stdlib.h> 4#include<stdint.h> 5 6#define K 0 7 8uint32_t xor128(void) { //乱数の生成(0以上2^32未満) 9 static uint32_t x = 123456789; 10 static uint32_t y = 362436069; 11 static uint32_t z = 521288629; 12 static uint32_t w = 88675123; 13 uint32_t t; 14 15 t = x ^ (x << 11); 16 x = y; y = z; z = w; 17 return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); 18} 19 20int fac(int n) { //階乗の計算 21 int result = 1; 22 int k; 23 24 for (k = 1; k <= n; k++) { 25 result *= k; 26 } 27 return result; 28} 29 30int cmb(int n, int k){ //combinationの計算 31 int c; 32 c = fac(n) / (fac(k) * fac(n - k)); 33 return c; 34} 35 36int main(void){ 37 int P[101]; 38 int W[101] = {0}; 39 int i, k, l; 40 long a; 41 double r; 42 43 P[0] = 1; 44 P[100] = 1; 45 46 for (i = 1; i <= 99; i++){ 47 P[i] = cmb(100,i); 48 } 49 50 W[K]++; 51 k = K; 52 53 for (i = 1; i < 10000; i++){ 54 a = xor128(); 55 if (a < pow(2, 31)){ 56 l = k - 1; 57 if (l == -1){ 58 l = 100; 59 } 60 } 61 else{ 62 l = k + 1; 63 if (l == 101){ 64 l = 0; 65 } 66 } 67 68 a = xor128(); 69 r = (double)P[l] / (double)P[k]; 70 r = fmin(r, 1); 71 if (a < pow(2, 32)*r){ 72 k = l; 73 } 74 75 W[k]++; 76 } 77 78 for (i = 0; i <= 100;i++){ 79 printf("%d\n",W[i]); 80 } 81 82 return 0; 83} 84

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

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

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

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

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

guest

回答2

0

ベストアンサー

途中の計算結果が大きすぎて、intで表現できていないのではないでしょうか?

こちらのサイトによると、100C50は100891344545564193334812497256だそうです。
また、combinationの計算方法も、先に分子と分母を求めて除算結果を返しておられるようですが、ここで必要になる100!はさらに大きく93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000です。
こちらのサイトで紹介されているような、漸化式による方法がいいかもしれません。

投稿2017/07/21 19:39

Bongo

総合スコア10807

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

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

jackie687456

2017/07/22 12:55

無事解決しました。ありがとうございました。
guest

0

web関係以外は全くわからないのですが、ちらっとint型は扱える数が限られていると聞いたことがあります。
Bongoさんと同じく、intが使えないものと思います。

投稿2017/07/21 23:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問