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も見ています
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。特にものすごく怒られたときとか、とんでもない損害を与えてしまったときとか…。
-
Run-Time Check Failure #3というエラーが出ます。
C言語・C++・C#
-
C言語のfor文です。 繰り返しの中で文字を一つずつ増やしていくやり方を教えてください for(i=
C言語・C++・C#
-
Excelでx軸とy軸を設定して図を作成したい。
Excel(エクセル)
-
-
4
e^-2xの積分
数学
-
5
C言語のポインターに関する警告
C言語・C++・C#
-
6
エクセルの散布図グラフで、横比1:1の図形を作画したい
その他(Microsoft Office)
-
7
Labelコントロールに数字を代入する
C言語・C++・C#
-
8
-1.#IND00と出てしまうのですが・・・
C言語・C++・C#
-
9
条件が多い場合
C言語・C++・C#
-
10
【急募】Wordに貼りつけた画像に線を引きたい
Word(ワード)
-
11
実験における誤差範囲の許容範囲の決め方ってどうやればいいんですか? また、一般的には具体的にどこ程度
大学・短大
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
c言語で、繰り返し文の中で、0....
-
doubleの変数にintとintの割り...
-
C言語 関数プロトタイプ宣言の...
-
C#のプログラミングについて(...
-
関数におけるif文とreturn文に...
-
至急です! マクロ定義で #defi...
-
C言語でintをdoubleに
-
指数の表示
-
C言語で台形公式を使った二重積...
-
浮動小数点の定数
-
C言語の型による処理速度の違い
-
C言語
-
int とdoubleの比較
-
セグメントエラー
-
プログラムの変更
-
C言語を実行すると-infが出てき...
-
C言語で直角三角形の斜辺を求め...
-
c言語のプログラミングについて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
Cで3乗根を求める方法
-
C言語 関数プロトタイプ宣言の...
-
関数におけるif文とreturn文に...
-
至急です! マクロ定義で #defi...
-
-1.#IND00と出てしまうのですが...
-
2次方程式の解を求めるプログ...
-
2分法で方程式の複数の解を自...
-
doubleは常に%lfとするべきなのか
-
C言語で-23乗を取り扱うには
-
C++で外積
-
int とdoubleの比較
-
C言語のプログラムで#include<m...
-
方程式を2分法を用いて解くプロ...
おすすめ情報