

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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# c言語 1 2022/11/09 13:05
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語で自然数nを入力、2以上n以下の偶数の累積sumを求めるプログラムをfor文を使って作りたいで 4 2022/11/09 14:10
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
配列を関数に渡す方法
-
プログラム
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
SIGALRMでプロセス終了
-
100未満の素数を表示するには
-
行列をべき乗させるプログラム
-
Aの値からBの値を除するとは??
-
「指定されたキャストは有効で...
-
エクセルで可視セルにのみ値貼...
-
C言語での引数の省略方法
-
DWORDの実際の型は何でしょうか
-
「Aに対するBの割合」と「Aに対...
-
#define _CRT_SECURE_NO_WARNIN...
-
ある商品のロス率を5%見込み、...
-
visualstudio C# テキストボッ...
-
プログラムでの数字につく”f”の...
-
多重定義が起きている?--lnk20...
-
2÷3などの余りについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
配列を関数に渡す方法
-
getcの改行判定
-
C言語の二分法のプログラムにつ...
-
C言語 マスターマインドゲーム...
-
全角文字の判定
-
計算結果がlong型以上になる場...
-
while文を使った問題なのですが...
-
C言語初心者です。次の問題で質...
-
C言語 数字以外を入力させない...
-
初心者です。
-
C++での乱射ショットについて教...
-
if文
-
raspberrypiでロータリエンコーダ
-
C言語で電卓を作成する。
-
双方向リスト
-
入力した数値を0~3乗するプロ...
-
scanfが実行されません
おすすめ情報