

No.4ベストアンサー
- 回答日時:
これでどうでしょう。
if文判定、及びwhile文判定を修正しました。
#include <stdio.h>
#include <math.h>
#define f(x)(x*x-2.0)
int main(void)
{
int i=0;
double m,x1=2.0,x2=1.0,eps=1.0e-5;
do{
++i;
m=(x1+x2)/2;
if (f(m)>0)
{
x1 = m;
}
else
{
x2 = m;
}
}
while (fabs(x1-x2)>eps);
printf("%f,%d\n",m,i);
return 0;
}

No.3
- 回答日時:
手抜きですが、こんな感じですか…
#include <stdio.h>
/*
sqrt(2.0) を二分探索法で求める
left 探索範囲左限界
right 探索範囲右限界
conv_cond 収束条件
*/
void solve(double left , double right , double conv_cond)
{
int count; /*試行回数*/
double center; /*中間値*/
for(count=0 ; ; count++)
{
center = (left + right) / 2.0;
/*収束条件を満たしたか*/
if((center - left < conv_cond) &&
(right - center < conv_cond)) break;
/*解は中間値よりも大きいか小さいか*/
if(center*center - 2 < 0)
{
left = center;
}
else
{
right = center;
}
}
printf("%d %f\n" , count , center);
}
int main(void)
{
solve(0 , 2 , 1.0e-5);
return 0;
}
ありがとうございました。
実行するとうまくいきました。
ちなみに、自力で作ってみました。
#include <stdio.h>
#include <math.h>
#define f(x)(x*x-2.0)
main()
{
int i=0;
double m,x1=2.0,x2=1.0,eps=1e-5;
do{
++i;
m=(x1+x2)/2;
if (f(m)*x1>0){
m=x1;
}
else
m=x2;
}
while (fabs(x1-x2)<eps);
printf("%f,%d\n",m,i);
}
これを実行すると、2.000000,1と出ます。
私はこの程度のプログラムしか習ってません。
つまり、ANo.3の方のプログラムだと、解読できないです。
もしよろしければ、自力でやったプログラムに訂正箇所があればお願いします。
ANO.1の方とお礼がかぶってしまい、申し訳ございません。
No.2
- 回答日時:
★リンクの紹介。
>二分法によりルート2の近似値を求めるプログラム、ってどうやって作ったらいいんですか?
↑
次のリンクの『32ビットの整数の場合でループを展開したもの』をご覧下さい。
http://ayusya.hp.infoseek.co.jp/ProgramAlgorithm …
これがアルゴリズムです。
実際に組むときはループ処理をさせれば良いです。
なお、この考え方は数値表現に2進数が使われている事に着目して 8192、4096、2048、1024…と
二分法で平方根を求めているのです。
>ちなみに初期値は2で、収束条件は10^-5です。
↑
double 型を使うなら初期値の 2、4、8、16、32、…と徐々に大きくしていきチェックします。
次のリンクも参考にしてみて下さい。
http://kyutechzemi.hp.infoseek.co.jp/0013/jp0000 …→『平方根を二分法で計算する。』
ソースもダウンロードできるようです。
このソースでは10^(-4)乗が収束条件のようです。
・以上。
参考URL:http://kyutechzemi.hp.infoseek.co.jp/0013/jp0000 …
ありがとうございました。
そうですか。。。
ちなみに、自力で作ってみました。
#include <stdio.h>
#include <math.h>
#define f(x)(x*x-2.0)
main()
{
int i=0;
double m,x1=2.0,x2=1.0,eps=1e-5;
do{
++i;
m=(x1+x2)/2;
if (f(m)*x1>0){
m=x1;
}
else
m=x2;
}
while (fabs(x1-x2)<eps);
printf("%f,%d\n",m,i);
}
これを実行すると、2.000000,1と出ます。
訂正箇所があればお願いします。
ANO.1の方とお礼がかぶってしまい申し訳ありません。
No.1
- 回答日時:
>関数とかif else文とかwhile文とかfor文とか、そういう簡単なのしか習ってないので
その程度の範囲で書けるはずです。ニュートン法より易しいと思うのですが。
そうですか。。。
ちなみに、自力で作ってみました。
#include <stdio.h>
#include <math.h>
#define f(x)(x*x-2.0)
main()
{
int i=0;
double m,x1=2.0,x2=1.0,eps=1e-5;
do{
++i;
m=(x1+x2)/2;
if (f(m)*x1>0){
m=x1;
}
else
m=x2;
}
while (fabs(x1-x2)<eps);
printf("%f,%d\n",m,i);
}
これを実行すると、2.000000,1と出ます。
訂正箇所があればお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
教えてください
-
for文について
-
raspberrypiでロータリエンコーダ
-
#if 1 #elseの意味について
-
プログラミングで二番目に大き...
-
getcの改行判定
-
1年単利金利 0.2% の A銀行と...
-
素因数分解のプログラムを作成...
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
for文
-
計算結果がlong型以上になる場...
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
2÷3などの余りについて
-
プログラミング初心者です。 Py...
-
「指定されたキャストは有効で...
-
Aの値からBの値を除するとは??
-
20'(角度)の計算がわかりま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#if 1 #elseの意味について
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
配列を使って魔方陣
-
プログラミングで二番目に大き...
-
getcの改行判定
-
C言語の二分法のプログラムにつ...
-
C言語階乗の総和を求める
-
C言語 プログラム
-
c言語のプログラミングでこま...
-
1からnまでの和を求めるプログ...
-
初心者です。for文、if文を使っ...
-
計算結果がlong型以上になる場...
-
while文について、c言語...
-
最大値と最小値を表示したいの...
-
scanf関数を用いての加減乗除%...
-
プログラムの内容
-
10進数からN進数に変換するプロ...
-
scanfが実行されません
おすすめ情報