

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で質問しましょう!
似たような質問が見つかりました
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
e^(x^2)の積分に関して
数学
-
ニュートン法について 初期値
数学
-
visual studio でインデントを自動的に揃えるショートカットキー
その他(プログラミング・Web制作)
-
-
4
TEXの表の位置が・・・
その他(プログラミング・Web制作)
-
5
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
6
Cプログラミングの問題です。ニュートン法を利用して3次方程式の解を求めるプログラミング作成。
C言語・C++・C#
-
7
#include <Windows.h>というヘッダファイルについて
C言語・C++・C#
-
8
*をユーザーが入力した数字の数だけ表示するプログラムの作り方を教えてください
C言語・C++・C#
-
9
プログラムC言語の整数の約数について教えてください
工学
-
10
python エラー
その他(プログラミング・Web制作)
-
11
以下のプログラムは重心を求めるプログラムなそうなのですが、例えば検出した円や四角形の重心を取るとしま
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
c言語で、繰り返し文の中で、0....
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語のコンパイルエラー canno...
-
関数におけるif文とreturn文に...
-
C言語を実行すると-infが出てき...
-
浮動小数点の定数
-
int とdoubleの比較
-
-1.#IND00と出てしまうのですが...
-
型変換のitoaのaって?
-
c言語の問題
-
C言語で-23乗を取り扱うには
-
方程式を2分法を用いて解くプロ...
-
C言語の複素数についてです。
-
fgets()による繰り返し入力(c言語)
-
C言語 関数プロトタイプ宣言の...
-
C言語の型による処理速度の違い
-
線形補間
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
C 開放してるのにエラー(doubl...
-
float型とdouble型の変数の違い...
-
C言語を実行すると-infが出てき...
-
関数におけるif文とreturn文に...
-
c言語で、繰り返し文の中で、0....
-
Cで3乗根を求める方法
-
int とdoubleの比較
-
C言語 関数プロトタイプ宣言の...
-
C言語の型による処理速度の違い
-
2次方程式の解を求めるプログ...
-
ax^2+bx+c=0の解を求めたいので...
-
至急です! マクロ定義で #defi...
-
C++で外積
-
線形補間
-
指数形式で入力するには
-
doubleは常に%lfとするべきなのか
-
c言語のコンパイルエラー canno...
-
C言語のpow関数の不具合
おすすめ情報