• ベストアンサー

小数点以下五桁一致の判定

ある実数の定数があり、変数をfor文により変化させて、小数点以下五桁が一致したらbreakしたいのですが、判定がうまくできません。 自分が作ったプログラムは、定数をk,変数をjと置くと sa=fabs(k-j); if(sa<1/1000000)break; としました。 一応出るのですが、ループの回数が、最低限にならないです。いい方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • tailkuppa
  • ベストアンサー率53% (52/98)
回答No.1

(1) とり得る値の最小、最大値をそれぞれ x0 x1 としてあらかじめ決めます。 (2) fabs(x0 - k) と fabs(x1 - k) を比較します。   このとき、どちらかの値が 10の-5乗未満であれば、求める値はそのときのx0 または x1 になります。 (3) fabs(x0 - k) < fabs(x1 - k) の場合、 x1 = (x0 + x1) / 2.0 として、(2) の比較を行います。   fabs(x0 - k) > fabs(x1 - k) の場合、 x0 = (x0 + x1) / 2.0 として、(2) の比較を行います。   fabs(x0 - k) == fabs(x1 - k) の場合、求める値は (x0 + x1) / 2.0 です。   区間を2つに区切って、どちらの区間にk が存在するかを判定していく考え方です。 頭からずーっと走査して行くよりはそこそこ早くなると思います。

beatman
質問者

お礼

ありがとうございます。 こんなやり方もあるんですね。素晴らしいです!! 参考にさせていただきます。

その他の回答 (1)

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.2

1/1000000の部分は0になると思います。1.0/1000000としたらどうでしょうか?

beatman
質問者

補足

ありがとうございます。 すみません。書き込むときのミスです。 1/1000000.0 としました。

関連するQ&A

  • フィードバック制御系において

    Kを正の実数の変数として K・H(s)を開ループゲインとすると 閉ループゲインは G(s)=1/(1+K・H(s)) ですが このとき開ループゲインを決定する変数Kは何と呼ばれるのでしょうか?

  • c 画像の一致を調べる

    ppmの画像2つがあり、画像2は画像1のどこか一部分を切り取った画像です。 HEIGHT 画像1の縦 WIDTH 画像1の横 HEIGHT_R 画像2の縦 WIDTH_R 画像2の横 とします。 image[i][j].g 画像1 image_re[i][j].g 画像2 には各位置での緑の色情報を格納しているとします。このときに比較の方法は次のようにしてみました。画像1の左上の座標を(0,0)として横に調べていき、一致したところ(1)でそこからWIDTH_Rだけの幅の範囲で各マスが合っているか比較し、合っていれば次の下の行について同じことをして。。。 それでもし一致しないところが出てきたら、(1)のもう一つ横マスについておなじことをやって。。。 と繰り返していく方法です for(i=0; i<HEIGHT; i++) for(j=0; j<WIDTH; j++) for(m=i; m<i+HEIGHT_R; m++){ if(a=0){a=1;break;} if(image[j][m].g == image_re[j][m].g) for(k=j; k<j+WIDTH_R; k++) if(image[k][m].g==image_re[k][m].g)a=1; else {a=0; break;} else break; if(m==i+HEIGHT_R)printf("TRUE"); としてみたのですが どうもsegmentation fault と出てしまいます。 まちがってるところがあればご指摘下さい

  • Σ計算と意味

                                Σa=sa                 k=1からsまでで    この問題でなぜsaとなるのですか?kはどこに行ってしまったのですか?kとsとaは変数ですか?それとも定数ですか?これはどういう意味をしめしているのですか?だれか教えて下さい。                                       Σ10=100                k=1から10までで、 この問題もなぜこうなるのか わからないので教えてください。

  • 「小数点以下2桁」と「小数点2桁」

    「小数点以下2桁」と「小数点2桁」 「小数点以下2桁」という表現は正しいかと思うのですが、 同じ意味で「小数点2桁」という記載は正しいのでしょうか? できれば、出展を添えてご教示頂ければ幸いです。

  • linux RedHatでC言語

    整数、単精度(float)、倍精度(double)の変数変換、各種書式付出力について教えてください。 また、よろしければ、40桁の整数、有効数字20桁の実数、小数点以下15桁の実数を表示する方法について教えてください。 本当にC言語の初歩だとは思いますが教えてください。

  • Javaで小数点第4までを処理したい。

    現在近似曲線を算出するプログラムを自作しています。 正確に算出するところまでは到達出来たのですが、最後に小数点以下が多すぎるので、小数点第四までに抑えたいです。 しかし、小数点を処理するようなプログラムを想定していなかったので、とても困惑しております。 私が作っているプログラムはこんな感じです。 <title>近似曲線プログラム</title> <body> <form name="Form1"> <font color="red">近似曲線用プログラム</font><br><br> ・X=<input type= "text" size="11" name="a"><input type= "text" size="11" name="b"><input type= "text" size="11" name="c"><br> ・Y=<input type= "text" size="11" name="e"><input type= "text" size="11" name="f"><input type= "text" size="11" name="g"><br>    <input type= "button" value= "近似曲線の数式を算出" onclick="keisan1()"><br><br> ・標本数=3<br><br> ・Xの平均値=<input type= "text" size="11" name="i"><br> ・Yの平均値=<input type= "text" size="11" name="j"><br><br> ・ΣXi<sup>2</sup>=<input type= "text" size="11" name="k"><br> ・ΣXiYi=<input type= "text" size="11" name="l"><br><br> ・a=<input type= "text" size="11" name="m"><br> ・b=<input type= "text" size="11" name="n"><br><br> 結果<br> ・y=<input type= "text" size="11" name="o">x+<input type= "text" size="11" name="p"> </form> <script language="JavaScript"> function keisan1(){ a = document.Form1.a.value-0; b = document.Form1.b.value-0; c = document.Form1.c.value-0; e = document.Form1.e.value-0; f = document.Form1.f.value-0; g = document.Form1.g.value-0; i=(a+b+c)/3; j=(e+f+g)/3; k=(a*a)+(b*b)+(c*c); l=(a*e)+(b*f)+(c*g); m=(l-3*i*j)/(k-3*(i*i)); n=j-m*i; o=m; p=n; document.Form1.i.value = i; document.Form1.j.value = j; document.Form1.k.value = k; document.Form1.l.value = l; document.Form1.m.value = m; document.Form1.n.value = n; document.Form1.o.value = o; document.Form1.p.value = p; } </script> </body> この中で、結果のoとpの部分を、小数点第四にまでに抑えたいのです、今現在では、小数点以下が10ケタ以上普通に出てしまいます。どちらも四ケタに抑えたいので、このプログラムに導入出来るような小数点処理のプログラムを知っている方がいらっしゃれば、是非丁寧に教えてほしいです。 よろしくお願いします。

  • 行列に関して。

    以下の行列を対角成分が最も大きくなるような プログラムをつくりたいのですが 0   1   4  3 7   0   1  -5 1    3   0   7 -2   4   4  -8 #include<stdio.h> #include<math.h> #include<stdlib.h> #define NUM 4 int main(){ /* 初期化 */ int i; /* ループ変数 (行)*/ int j; /* ループ変数 (列)*/ int k; /* ループ変数 */ int imax; /* 最大値のi成分 */ int jmax; /* 最大値のj成分 */ double nmax; /* 最大値を入れるための変数 */ double tmp; /* ソートのための一時的な変数 */ double eps = 1.0e-6; /* 判定値 */ double a[NUM][NUM] = { { 0.0, 1.0, 4.0, 3.0}, { 7.0, 0.0, 1.0, -5.0}, { 1.0, 3.0, 0.0, 7.0}, {-2.0, 4.0, 4.0, -8.0}}; /* 対象とする要素位置 = k */ for( k = 0 ; k < NUM ; k++ ){ /*対象とする要素位置 = k*/ nmax = 0.0;/* 初期化 */ imax = k;/* 初期化 0とは限らない */ jmax = k;/* 初期化 0とは限らない */ /* 1.絶対値の最大値を求める */ for( i = k ; i < NUM ; i++ ){ for( j = k ; j < NUM ; j++ ){ if(fabs(nmax) < fabs(a[i][j])){ nmax = a[i][j]; imax = i; jmax = j; /* 対象としている行列要素の中で,最大となる行列要素のi,j成分を探す */ /*ここに絶対値の最大値を求め、nmax、imax、jmaxに代入するプログラムを書く*/ /*絶対値の求め方、数学関数fabs(x)を用いる*/ } } } /* 2.行入れ換え */ if( k != imax ){/* 対象としている行と最大値を持つ行が同じなら,入れ替える必要が無い */ for( j = 0 ; j < NUM ; j++ ){ tmp=a[k][j]; a[k][j]=a[imax][j]; a[imax][j]=tmp;/* 対象としている行と最大値を持つ行との入れ替え */ /*ここに行の入れ替え行うプログラムを書く*/ } } /* 3.列入れ換え */ if( k != jmax ){/* 対象としている列と最大値を持つ列が同じなら,入れ替える必要が無い */ for( i = 0 ; i < NUM ; i++ ){ tmp=a[i][k]; a[i][k]=a[i][imax]; a[i][imax]=tmp;/*対象としている列と最大値を持つ列との入れ替え*/ /*ここに列の入れ替え行うプログラムを書く*/ } } } /* 結果の出力 */ for(i=0; i<NUM; i++){ for(j=0; j<NUM; j++){ printf("%5.1f ",a[i][j]); } printf("\n"); } /*ここに行列の表示プログラムを書く*/ return(0); } 上のぷろぐらむを実行しても、1個目のfor文の1ループ目で終了してしまい 1行目と、4行目を交換、4列目と1列目を交換した行列だけが表示されます。 結果が以下のような行列にするにはどう改善すればよいでしょうか? -8.0   -2.0  4.0  4.0 -5.0   7.0  1.0  0.0   3.0   0.0  4.0  1.0  7.0   1.0  0.0  3.0 です。

  • forループに慣れるには

    初めまして。 今資格を取ろうと思い独学でJavaを勉強してるんですが、 つまらない部分でつまずいています。 それは少々複雑なfor等のループです。 変数を追っていくうちにこんがらがってしまい、 変数の正しい値を見失ってしまいます。 例えば… Loop: for(int i = 0; i<5; i++) { for(int j =0; j<5; j++) { if(i==j) continue Loop; System.out.println("i = " +i+ "j = " +j); if(i > 3) break Loop; } } や、 int i,j; for(i = 0, j = 0; i<3;) { if(i++ == 2 || j++ == 2) break; } System.out.println(i); System.out.println(j); の様なループです。 試験範囲は大方勉強出来てるんですが まぬけな事にループがイマイチ理解出来てなくて(恥) 皆さんはどうやって慣れてこられましたか? つまらない質問ですが何か良いコツやアドバイスがあれば よろしくお願いします。

  • 桁を減らす(小数点以下ではなく)

    例えば123,456という数字を 123と桁を減らして表示するにはどうしたらよいのでしょうか? 123456円を123千円と表記するような意味です。

  • 小数点以下二桁まで求める?

    小数点以下二桁までの後に、どの動詞を使ったらいいでしょうか? 言いたいのは、小数点以下二桁まで四捨五入で計算すること。 求める?丸める?それとも、ほかの動詞? 日本語学習者です。 よろしくお願いいたします。

専門家に質問してみよう