c言語で、繰り返し文の中で、0.01づつ増やすには?
c言語で、繰り返し文の中で、0.01づつ増やすにはどうすればよいのでしょうか?
関数F(x)=x3+2x-1
の値でx=0から5まで0.01刻みで増やし、出力させる
プログラムを作成せよ。という問題です。
#include <stdio.h>
int main()
{
double i;
for(i=0;i<=5;i+=0.01){
printf("%lf",i*i*i+2*i-1);
putchar('\n');
}
return(0);
}
で、はじめにi=0なので、はじめは-1のはずですが、なぜか初めの値が11.28…と表示されます。これを0.1刻みで i+=0.1 とすると正常に作動するのですがどうでしょうか?
お願いします。
No.4ベストアンサー
- 回答日時:
ちなみに、
double i; で、 i = 0; と書いたとき、0 は確かに int ですが、double である i への代入で正常に「暗黙の型変換」が発生しますから、i = 0.0 とわざわざ書かなくても正常に代入されます。
あと、printf() における double に対する書式指指定子は、%lf ではなくて、%f です。(scanf() は、float は、%f, double は、%lf です)
printf() のような、可変数引数の関数では、float は暗黙のうちに double に変換された後に渡されるので、printf() の場合、float も double もどちらも "%f" が正しい指定です。(ただし、C99 の規格では書いても許容されることになったらしい)
0.01 ずつ誤差無し(実際には誤差最小)で加算するのは、No.2 で回答されていますが、
#include <stdio.h>
int main()
{
int i;
for(i=0;i<=500;i++)
{
double x = i / 100.0; // こっちの 100.0 は、100 だと良くないことが起こります。100 だと int / int になるから。
printf("%f",x*x*x+2*x-1);
putchar('\n');
}
としてみたり、また、double であっても、数値として小数点以下がない場合は加算による誤差は発生しないので、
#include <stdio.h>
int main()
{
double i;
for(i=0;i<=500;i++)
{
double x = i / 100;
printf("%f",x*x*x+2*x-1);
putchar('\n');
}
でも同じです。
No.10
- 回答日時:
さて、forとwhileの等価性に関する話題が一段落したところで、本題への回答です。
>はじめは-1のはずですが、なぜか初めの値が11.28…と表示されます。
コマンドプロンプトか何かで実行していますか?
0.01きざみだと500行くらい出力しますよね。
結果をすべて表示するには画面バッファーの大きさが足りないのかも。
コマンドプロンプトのプロパティで、「画面バッファのサイズ」の「高さ」を増やしてみてください。
>0.1刻みで i+=0.1 とすると正常に作動する
これは、出力行数が画面バッファーのサイズ内に収まっているからでありましょう。
No.9
- 回答日時:
>・for文とwhile文は等価じゃないですよ~
そうではなくて、等価な場合とそうでない場合がある、というのが正しいです。
私自身、何が何でも等価だと主張する気はさらさらありません。
A;
while (B) {
/* 何かの文 */
C;
}
と、
for (A; B; C) {
/* 何かの文 */
}
とは、「何かの文」に
continue;
を含まなければ等価だ、ということです。理解できますか?
No.8
- 回答日時:
#6 では「今回の場合」と限定しているので, 「一般論として while と for が全く等価」という意味を持たせているわけじゃないと思いますよ>#7.
個人的には「for の代わりに while を使うこと」が的外れであるという #6 の見解に賛成. というか, 制御文の意味を考えれば, 本件に関してはむしろ「当然 for を使うべし」と判断します. 「for文のindexに小数点を利用するのは一般的でない」という点には賛成するものの (cf. #2), それは「整数を使え」と誘導すべきであり, 「じゃあ while」というのは筋がずれてる.
C の場合 while は実は for のサブセットでしかないので, 理論上「for があれば while は不要」ということはできます. でも, while がないと
for (;expression;) statement
とせざるを得ず, 「expression が泣いてるように見える」ので嫌 :-)
No.7
- 回答日時:
> No.6さん
ご指摘ありがとうございます、甘んじて受けましょう(^^
それに反論する気はありませんが、質問者様が誤解しない
ようにフォローだけはさせて下さい。
・for文とwhile文は等価じゃないですよ~、今回の例では
結果が同じですが、動きとしては異なりますし、可読性も
変化します。forとwhileが等価であれば、そもそもwhile文は
Cに不要=実装されないはずですから……。
・「for文のindexに小数点を利用するのは一般的でない」と
明示した点を汲んでもらえると助かります。そこは許して
もらえますか? 少なくとも自分の会社なら品質管理部から
戻されますし、そのように指導しています。個人の趣向でなく、
開発上のコーディング規約として定められているからです。
……と、あまりしゃべっては質問者様の問題解決を邪魔して
しまいそうなので。でも、「的外れ」という攻撃的な言葉、
QAサイトで使って欲しくなかったなぁ、重いっす(^^;
No.5
- 回答日時:
・結果が不安な場合であれば、ファイルに吐き出して
確認した方が安心できます。今回のように、出力される
データ数が多い場合は特に……です。
・for文の条件部に少数を使うのは、文法的には間違えて
いないのですが、一般的には避けたほうが無難かと。
「ああ、随分無理してるなぁ」という印象です。
「繰り返し文」との事ですので、for文限定という事じゃ
ないですよね? 今回の件は、無理にfor文を使うよりも
wihle文にした方が素直だと思いますよ。
double x = 0.0;
while(x <= 5.00)
{
printf("%lf\n", (x*x*x)+(2*x)-1);
x += 0.01;
}
学校の問題であれば、単純にコレでOKですね。
※カッコは不要ですがあえて付けています。単に可読性を上げる為です。
No.3
- 回答日時:
double i は実数ですが、i=0 の 0 は実数ではなく整数です。
for (i=0.0; i<=5.0;i+=0.01) で試されてはいかがでしょう。参考までに、よくある実数桁落ち誤差エラーを配慮した重み(+STEP/100.0)付きプログラム例
#include <stdio.h>
#define formula(x) x*x*x+2*x-1
#define STEP 0.01
int main(void)
{
double x;
for(x=0.0;x<=5.0+STEP/100.0;x+=STEP)
printf("%lf(%.2f) ",formula(x), x);
printf("\n");
return 0;
}
No.1
- 回答日時:
こちらでは、正常に出力されましたが?
行数が多くて、最初の部分がスクロールアウトしてしまい表示できない、ということでは?
この計算では全部で501行、11.28...は203行目にあります。
終了後のプロンプト表示とか考えたら、使ってる表示デバイス(なんかの端末ソフトなのか、IDEの出力ウィンドウなのか)が300行しか表示できないってことはないですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# (C言語)めちゃくちゃな値になってしまいます。 5 2022/08/13 11:55
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
このQ&Aを見た人はこんなQ&Aも見ています
-
見学に行くとしたら【天国】と【地獄】どっち?
みなさんは、一度だけ見学に行けるとしたら【天国】と【地獄】どちらに行きたいですか? 理由も聞きたいです。
-
スマホに会話を聞かれているな!?と思ったことありますか?
スマートフォンで検索はしてないのに、友達と話していた製品の広告が直後に出てきたりすることってありませんか? こんな感じでスマホに会話を聞かれているかも!?と思ったエピソードってありますか?
-
遅刻の「言い訳」選手権
よく遅刻してしまうんです…… 「電車が遅延してしまい遅れました」 「歯医者さんが長引いて、、、」 「病院が混んでいて」 などなどみなさんがこれまで使ってきた遅刻の言い訳がたくさんあるのではないでしょうか?
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
【大喜利】【投稿~12/6】 西暦2100年、小学生のなりたい職業ランキング
【お題】 ・西暦2100年の「小学生のなりたい職業ランキング」で1位になった職業は何か教えてください
-
C言語のfor文です。 繰り返しの中で文字を一つずつ増やしていくやり方を教えてください for(i=
C言語・C++・C#
-
関数から配列を返すには?
C言語・C++・C#
-
積分で1/x^2 はどうなるのでしょうか?
数学
-
-
4
オペアンプの位相差についてです。 周波数をあげていくと 高周波になるにつれて 位相がズレました。 こ
大学・短大
-
5
Run-Time Check Failure #3というエラーが出ます。
C言語・C++・C#
-
6
複数桁10進数の*桁目だけを抽出したい
C言語・C++・C#
-
7
数字以外が入力されたらエラー文を出したい。
C言語・C++・C#
-
8
C言語のポインターに関する警告
C言語・C++・C#
-
9
プログラムでの数字につく”f”の意味
C言語・C++・C#
-
10
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
11
入力した数値を倍々するプログラム
C言語・C++・C#
-
12
【力学】ねじり応力の単位
その他(教育・科学・学問)
-
13
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
14
∫1/(x^2+1)^2 の不定積分がわかりません
数学
-
15
-1.#IND00と出てしまうのですが・・・
C言語・C++・C#
-
16
条件が多い場合
C言語・C++・C#
-
17
実験における誤差範囲の許容範囲の決め方ってどうやればいいんですか? また、一般的には具体的にどこ程度
大学・短大
-
18
python エラー
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/6】 西暦2100年、小学生のなりたい職業ランキング
- ・ちょっと先の未来クイズ第5問
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++で外積
-
至急です! マクロ定義で #defi...
-
プログラムでの数字につく”f”の...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
-1.#IND00と出てしまうのですが...
-
C言語の型による処理速度の違い
-
int とdoubleの比較
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
C言語で内積、、、わかりません。
-
文字列をfloatで読み込む(atoi,...
-
C言語 関数プロトタイプ宣言の...
-
c言語のコンパイルエラー canno...
-
配列を戻り値にして逆行列を求...
-
2分法で方程式の複数の解を自...
-
関数におけるif文とreturn文に...
-
C言語初心者 構造体 課題について
-
C#イベント中の戻り値の設定の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語を実行すると-infが出てき...
-
c言語で、繰り返し文の中で、0....
-
C 開放してるのにエラー(doubl...
-
doubleの変数にintとintの割り...
-
至急です! マクロ定義で #defi...
-
C言語 関数プロトタイプ宣言の...
-
float型とdouble型の変数の違い...
-
2次方程式の解を求めるプログ...
-
int とdoubleの比較
-
difftime()について
-
関数におけるif文とreturn文に...
-
物体が往復する動きを作りたい
-
Cで3乗根を求める方法
-
-1.#IND00と出てしまうのですが...
-
C言語の型による処理速度の違い
-
2分法で方程式の複数の解を自...
-
浮動小数点の定数
-
listに構造体を格納
-
c言語のコンパイルエラー canno...
おすすめ情報