dポイントプレゼントキャンペーン実施中!

テント写像のプログラムについて質問です。

下記のプログラムにて
「テント写像の頂点位置を順次変えていき、その頂点のx座標値より大きいなら「1」小さいなら「0」をカウントし、最終的に、各x、yの値に置ける1と0の個数を表示する」
というプログラムを作ったのですが、明らかに計算回数(#define Nの値です)よりも多い値が出力されてしまい困っています。
皆様のお力で解決してもらえないでしょうか?

--------以下問題のプログラム----------
#include <stdio.h>
#include <math.h>
#define x0 0.10
#define N 100
main()
{
FILE *pt; /* ファイルポインタ */
double i,j;
double x,u=0;
double data;
int k;
int data1,data0;
data1=0;data0=0;
if((pt = fopen("tent_kosu2.dat","wt")) !=NULL){ /* ファイルオープン*/
for(i=0.1;i<=1;i+=0.1){ //xの刻み
for(j=0.9;j<=1;j+=0.01){ //yの刻み
for(k = 0, x=x0; k <= N; k++){
u = (j/ i);
x = 1.0-fabs(1.0-u*x); /* テント写像 */
data=x-i;
if(data>0){data1++;}
else if(data<0){data0++;}
if(k%N==0){/*計算回数が100回1セットなので1セット終了毎の個数を表示させる*/
fprintf(pt,"0は%d個 1は%d個¥t x=%5.2f y=%5.2f¥n",data0,data1,i,j);}/* ファイル書き込み */
}
}
}
}
}
fclose(pt); /* ファイルクローズ*/
}

---------ここまで-------

よろしくお願いします。

A 回答 (3件)

> main()



ちゃんと、型とか宣言するようにしましょう。

> for(i=0.1;i<=1;i+=0.1){ //xの刻み
> for(j=0.9;j<=1;j+=0.01){ //yの刻み

0.1,0.01等は誤差を含んでいます。
0.1+0.1+0.1+....
とすることで、誤差が大きくなります。下手すると、ループ回数が変わってしまいます(この例程度なら大丈夫だと思いますが)
精度を上げるためには、整数でループ→計算で実数に が推奨されます
/* 例:10倍して整数でループ→使用する値は0.1倍して実数に */
int i0;
for(i0=1;i0<=10;i0++){
i=i0 * 0.1;



質問の答えは、たぶん、data0,data1のリセットのタイミングの問題だと思いますが、#1にあるようにどうとでも取れる文章なのでわかりません
    • good
    • 0

k%N==0 は k が 0 でも N でも成り立ちます。


普通は
for(k = 0, x=x0; k < N; k++){
(略)
}
fprintf(pt,"0は%d個 1は%d個\t x=%5.2f y=%5.2f\n",data0,data1,i,j);
と書きます。
    • good
    • 0

「計算回数よりも多い値が出力される」とはどういう意味でしょうか?



「出力される値が計算回数より大きい」 (たとえば「最大でも 100 までしか出力されない」はずなのに 176 のような数値が出力される) ということ? それとも, 「出力される値の個数が計算回数より多い」 (たとえば「100個しか出力されない」はずなのに 193個出力される) ということ?
    • good
    • 0

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