アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語を実行すると-infが出てきて困っています。
コンパイラはgccを使っています。
よろしくお願いします。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define data 100//計算回数

double seiki(void)//正規乱数
{
double n;
double i;
double y;
double x1,x2;
double sigma;
double mean;
double Pi = 2*asin(1);

sigma = 1;
mean = 0;
{
x1 = (double)rand()/(RAND_MAX);
x2 = (double)rand()/(RAND_MAX);
y = sigma*sqrt(-2*log(x1))*sin(2*Pi*x2) + mean;
//printf("%f\n",y);
}
return (y);
}

int main(void)
{
double* price;
int i, j, k;
double a, b, c;

//メモリ確保
price=(double*)malloc(sizeof(double)*data+10);

for(i = 0;i<data;i++)
{
price[i+1] = price[i]+seiki();
printf("%lf\n",price[i+1]);
}
return 0;

}

A 回答 (4件)

で、本題の-infの件は、



>x1 = (double)rand()/(RAND_MAX);
>x2 = (double)rand()/(RAND_MAX);
>y = sigma*sqrt(-2*log(x1))*sin(2*Pi*x2) + mean;

log(x1)のところで、「たまたま発生した」x1=0を使っている
ためではないでしょうか。
0の対数は求められませんからね。
    • good
    • 0
この回答へのお礼

乱数を初期化してうまくいきました。
ありがとうございます。

お礼日時:2010/05/06 21:59

当方、Mac のGcc (v4.0.1)ですが、コンパイルもすんなり通りますし、実行もエラーなく出力していますけどね。

「C言語を実行すると-infが出てきて困っ」の回答画像4
    • good
    • 0

#1 に加えて mean や sigma (って何?) も初期化されていないですね.


ついでにいうと, seiki って関数は間違ってませんか? 「0 以上 1 未満」の乱数を使うのがセオリーだったような.
    • good
    • 1

>price[i+1] = price[i]+seiki();



iが0のとき、値が定まっていないprice[0]を参照しています。
malloc()で確保した領域の内容が特定の値(例えば0x00)で
埋まっているとは限りません。

>x1 = (double)rand()/(RAND_MAX);
>x2 = (double)rand()/(RAND_MAX);

rand()を使うのであれば、その前に一度だけ
乱数の種を初期化しておく必要があります。

その他、気になる点:
>price=(double*)malloc(sizeof(double)*data+10);

最後の+10の意味がわかりません。

定義しただけで使っていない変数が多々見受けられます。
余分なコードはそぎ落としましょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A