🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1958閲覧

c言語で数え上げ法による平方根を求めるプログラム

cgen

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/03/20 06:35

前提・実現したいこと

c言語で数え上げ法による平方根を求めるプログラムを書いています。

発生している問題・エラーメッセージ

一つ目のコードではうまくいかず、解が1.000になってしまいました。何が間違っているのかわかりません。 二つ目のコードではうまくいき、近似値として1.733が得られたのですが、なぜうまくいったのかわかりません。i<Nまで続けるという条件文ではxの値はどんどん大きくなってしまいfx>=0という条件文のif文では返されるxの値はどんどん大きくなってしまうのではないですか。なぜ正しい解が得られるのでしょうか。

該当のソースコード

c言語 ソースコード一つ目 #include <stdio.h> #include <math.h> double root(double n){ int a=1; int i=0; double fx, x; double d = 0.001; while(fx<=0){ x=a+i*d; fx=pow(x, 2)-n; i++; } x=a+i*d; return x; } int main(void){ double x; int n; printf("n> "); scanf("%d", &n); printf("%.3f\n", root(n)); return 0; } ソースコード二つ目 #include <stdio.h> #include <math.h> #define N 1000000 double root(double n){ int a=1; int i=0; double fx, x; double d = 0.001; while(i<N){ x=a+i*d; fx=pow(x, 2)-n; i++; if(fx>=0) return x; } } int main(void){ double x; int n; printf("n> "); scanf("%d", &n); printf("%.3f\n", root(n)); return 0; }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

fx が初期化されていないのに、fx <= 0 で参照しています。

追記

一つ目のコードではうまくいかず、解が1.000になってしまいました。

何が間違っているのかわかりません。

fx が初期化されていなくて、たまたま正の値が入っていたんでしょう。
while(fx<=0){ でループ条件が成立せず、ループの中に入りません。
a = 1、i = 0、d = 0.001 なので、x = a+i*d = 1.000 になります。
double fx = 0, x; に変更すると、正しく動くでしょう。

二つ目のコードではうまくいき、近似値として1.733が得られたのですが、なぜうまくいったのかわかりません。i<Nまで続けるという条件文ではxの値はどんどん大きくなってしまいfx>=0という条件文のif文では返されるxの値はどんどん大きくなってしまうのではないですか。なぜ正しい解が得られるのでしょうか。

i が 0、1、2、3、... と増えていくと、
x は、1.000、1.001、1.002、1.003、... と増えていきます。
pow(x, 2) は、1.000、1.002001、1.004004、1.006009、... と増えていきます。
i が 732 になったとき、x は 1.732 になり、pow(x, 2) は、2.999824 になります。
fx は 2.999824 から 3 を引くので負のままです。
i が 733 になったとき、x は 1.733 になり、pow(x, 2) は、3.003289になります。
fx は 3.003289 から 3 を引くので正になります。
if(fx>=0) return x; でループを抜け、関数root の実行を終了します。
i はこれ以上大きくなりませんし、x もこれ以上大きくなりません。

投稿2021/03/20 07:05

編集2021/03/20 15:14
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cgen

2021/03/20 15:10

ありがとうございます!!目から鱗です!できました!! あの、二個目って、iが100000とかどんどん大きくなってxの値はnの平方根よりどんどん大きくなっちゃうと思うんですけど、どうして上手くいくんですか?
cgen

2021/03/21 09:40

丁寧にありがとうございます!! if文でループを抜けるということがわかっていませんでした。 ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問