c言語について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sato

c言語について

#1

投稿記事 by sato » 17年前

はじめまして、satoです。早速質問何んですが、放物線運動の計算を行うプログラムを作成してグラフを作るということを大学の課題でだされました。しかし、自分でやってみたら式はちゃんと書いているはずなのに斜方投射の様なグラフになりません。間違いがないか調べてください。お願いします!               ソース
#include<stdio.h>
#include<math.h>

int main (void)
{
double t,x,y,v0,g,theta;

g=9.8;

theta=30*M_PI/180.0;/*θ=30°のとき */
v0=10; /* M_PIはπの値が定義されている */
for(t=0;t<=2;t+=0.0625){
x= v0*t*cos(theta);
y= -0.5*g*t*t+v0*t*sin(theta);
printf("%lf%lf\n"x,y);
}
return 0;
}

たかぎ

Re:c言語について

#2

投稿記事 by たかぎ » 17年前

とりあえず、ソースは<pre>~</pre>で囲みましょうか?(実際には半角で書いてください)
http://dixq.net/board/board.htmlを呼んでいないことがバレバレですよ。

sato

Re:c言語について

#3

投稿記事 by sato » 17年前

失礼しました。では、改めて
<pre>
#include<stdio.h>
#include<math.h>

int main (void)
{
double t,x,y,v0,g,theta;

g=9.8;

theta=30*M_PI/180.0;/*θ=30°のとき */
v0=10; /* M_PIはπの値が定義されている */
for(t=0;t<=2;t+=0.0625){
x= v0*t*cos(theta);
y= -0.5*g*t*t+v0*t*sin(theta);
printf("%lf%lf\n"x,y);
}
return 0;
}
</pre>
ちなみにプログラム歴は一ヶ月です。

たかぎ

Re:c言語について

#4

投稿記事 by たかぎ » 17年前

> <pre>

よく読んでください。

[color=yellow>「実際には半角で書いてください」[/color]

と書きましたよ。

> 間違いがないか調べてください。

少なくとも、
printf("%lf%lf\n"x,y);
の部分が間違っています(xの前に , がない)。

ところで、処理系不明(printfの書式からして、C99対応の処理系だということは分かります)なので何とも言えませんが...

このプログラムを実行するとグラフが描画されると考えているのであれば多分違います。
そんな表示の仕方をしてくれる標準出力が存在する可能性、あるいはパイプで他のプログラムに食わせる可能性はありますが。

sato

Re:c言語について

#5

投稿記事 by sato » 17年前

> このプログラムを実行するとグラフが描画されると考えているのであれば多分違います
ですが、グラフはgnuplotでやれと言われたので、それなしで実行できないのはわかってます。
> パイプで他のプログラムに食わせる
というのは、どういうことですか? a.out > (ファイル名).dat のような感じですか?<!--1

L

自然対数eを小数点第60位で表示

#6

投稿記事 by L » 17年前

はじめまして。
学校の課題で
マクローリン展開を用いて
自然対数のeを小数点第60位で表示しろという課題がでました。

マクローリン展開自体は学校で習ったのでそこでのつまづきはなかったですが、
小数点第60位で表示 というのがわかりません。


マクローリン展開
e= 1 + 1/1! + 1/2*1 + 1/3*2*1 + 1/4*3*2*1 +・・・+1/60!


よろしくお願いします

たかぎ

Re:自然対数eを小数点第60位で表示

#7

投稿記事 by たかぎ » 17年前

> 小数点第60位で表示 というのがわかりません。

私も分かりませんが、おそらく「小数第60位まで表示」のことではないでしょうか?

L

Re:自然対数eを小数点第60位で表示

#8

投稿記事 by L » 17年前

ぁ 書き間違えました;;
まで です。

どうやって表示すればよいのでしょう?



long double
で表示可能ですか?

lbfuvab

Re:自然対数eを小数点第60位で表示

#9

投稿記事 by lbfuvab » 17年前

出来なければ
http://www5.airnet.ne.jp/tomy/cpro/mpa.htm
とかを参考にするしかないですね。

tk-xleader

Re:自然対数eを小数点第60位で表示

#10

投稿記事 by tk-xleader » 17年前

どうもdouble型を含む通常の型では不可能な気がします。
浮動小数点数、もしくは固定小数点数を実装する必要がありそうです。

たかぎ

Re:自然対数eを小数点第60位で表示

#11

投稿記事 by たかぎ » 17年前

> long double
> で表示可能ですか?

表示可能かどうかは、表示用のデバイスを搭載しているかどうかなど、実行環境に依存します。
long doubleで計算できるかどうかについては翻訳環境に依存します。

たかぎ

Re:自然対数eを小数点第60位で表示

#12

投稿記事 by たかぎ » 17年前

今気づいたのですが、課題を文面どおりに解釈すれば、マクローリン展開による計算は机上で行い、結果だけを表示させればよい気がします。
例えば、桁数は足りませんし、表示ではなく標準出力への出力ですが、
#include <stdio.h>
int main()
{
  puts("2.7182818284590452353602874713527");
  return 0;
}
といった具合でよいのではないですか?
そうでなければ、マクローリン展開自体もプログラムで計算する必要がありますね(例えばn階導関数を求めるとか...)。

たかぎ

Re:自然対数eを小数点第60位で表示

#13

投稿記事 by たかぎ » 17年前

一応、小数点以下60桁までのネイピア数を書いておきます。61桁目で四捨五入しています。

2.718281828459045235360287471352662497757247093699959574966968

L

Re:自然対数eを小数点第60位で表示

#14

投稿記事 by L » 17年前

みなさんありがとうございます!

課題は計算まで含まれるそうです;;
for文で計算してその結果を
表示すればいいのだと思いますが、
やはりlong doubleでは不可能でした。
途中から000000といった具合に。。

double < long double < ?
?に相当するものってありますか?

最近関数を習ったのですが、もしかして関数でけいさんするとか??

たかぎ

Re:自然対数eを小数点第60位で表示

#15

投稿記事 by たかぎ » 17年前

> 課題は計算まで含まれるそうです;;

くどいようですが、
∞
Σ[/color] f(n)(0)/n! * xn
n=0
自体の計算はしなくてもよいのですか?
これを机上でやってもよいのであれば、最後までやっても五十歩百歩だと思うのですが...

> double < long double < ?
> ?に相当するものってありますか?

ありません。
どうしても数値計算をやりたいのであれば、多倍長演算が必須です。

hoge

Re:自然対数eを小数点第60位で表示

#16

投稿記事 by hoge » 17年前

> double < long double < ?
> ?に相当するものってありますか?

標準にはありません。
lcc-win32ならqfloatがあり、100桁程度の精度があるようです。

http://www.cs.virginia.edu/~lcc-win32/

たいちう

Re:自然対数eを小数点第60位で表示

#17

投稿記事 by たいちう » 17年前

> 自体の計算はしなくてもよいのですか?
> これを机上でやってもよいのであれば、最後までやっても五十歩百歩だと思うのですが...

横からすみません。たかぎさんの意図が分からないのですが、
ご説明いただけないでしょうか?

私がこの課題をやるとしたら、多倍長のクラスを用意して、
Lさんが最初に書いた式で必要桁数を計算するプログラムを提出します。

その前段階としては、eのマクローリン展開が、その式になることの証明をすれば十分と
思いますが、たかぎさんの考えでは、eのn階導関数がeであることも使わない方が
良いということでしょうか?

やそ

Re:自然対数eを小数点第60位で表示

#18

投稿記事 by やそ » 17年前

横から失礼。
この課題、課題としてどうなんだろう???

もし私が講師だとしたら、このような出し方はしないです。
「long doubleの限界を超える数値の計算」を主題にしているのでしょうか?
マクローリン展開をプログラミングさせたいのが主題なのでしょうか?

後者なら普通は型の限界を超えるような値まで計算させることはしませんし、不毛です^^;
前者なら、「多倍長演算」について補足をしなければ、課題としては不適切なように思えます・・・

わたしが学生の立場なら「60桁って教えられた型の限界に収まるんですか?」と講師に質問したいです。

有効桁数についての参考ページ
http://web.hc.keio.ac.jp/~fujimura/lang/page-7-3.html

たかぎ

Re:自然対数eを小数点第60位で表示

#19

投稿記事 by たかぎ » 17年前

> その前段階としては、eのマクローリン展開が、その式になることの証明をすれば十分と
> 思いますが、たかぎさんの考えでは、eのn階導関数がeであることも使わない方が
> 良いということでしょうか?

どうするのがよいのかは、Lさん、または出題者にしか分かりません。
ただ、

> 課題は計算まで含まれるそうです;;

とのことなので、それがマクローリン展開自体の計算を行う必要はないのですか、と確認しているのです。
課題の内容が、例えば、外部から与えたxに対して、exを小数第60位まで求めるということであれば、机上で計算できるところまで計算して、残りを実行時に行うのが普通でしょう。
ところが、今回は最終的な結果まで机上で計算できてしまいます。
だとすると、どこまでを机上で計算して、どこからを実行時に計算させるのかが不明確です。
また、展開後の数値計算だけを行うにしても、階乗の逆数だけでも机上で計算してよいのであれば、多倍長の除算を実装しなくても済むため、非常に楽になります。

> 私がこの課題をやるとしたら、多倍長のクラスを用意して、
> Lさんが最初に書いた式で必要桁数を計算するプログラムを提出します。

私も、自分でネイピア数を61桁まで求めるのであればそうすると思います。
しかし、この課題を解く場合、それが題意に沿っているのかどうかはやはり確認が必要です。

たいちう

Re:自然対数eを小数点第60位で表示

#20

投稿記事 by たいちう » 17年前

to たかぎさん:

> ところが、今回は最終的な結果まで机上で計算できてしまいます。
> だとすると、どこまでを机上で計算して、どこからを実行時に計算させるのかが不明確です。

なるほど、納得しました。私は私の常識に従いどこを実行時に計算させるべき、と補完していました。
補完があっているかどうかは別として、たかぎさんはその点を確認されたわけですね。


to やそさん:

> この課題、課題としてどうなんだろう???
>
> もし私が講師だとしたら、このような出し方はしないです。

Lさんに与えられた課題がこれだけだったらかなり不親切ですね。

# 色々憶測すると、講義か他の課題で多倍長について触れていたのか、
# 高度な要求をしている課題なのでしょう。


お2人ともありがとうございました。

L

Re:自然対数eを小数点第60位で表示

#21

投稿記事 by L » 17年前

みなさんありがとうございます

見たことがない難しい言葉が出てたりしていて答えにくいのですが、


課題の内容を(黒板に書かれたまま)書くと、
マクローリン展開を用いて自然対数eを小数点代60位まで表示するプログラムを作りなさい。
です。
机上での計算はしないと考えていいと思います。
で、「longでは表示できないからネットなどで調べて表示できるようにしなさい。」
と、言ってました。

これまでもネットで調べたり、教科書の後半のほうを見ないと答えられないような、応用問題が結構あって、
今回の課題も前期で最終のものなのでやはり、難しいものでした。

たかぎ

Re:自然対数eを小数点第60位で表示

#22

投稿記事 by たかぎ » 17年前

> 机上での計算はしないと考えていいと思います。

ということは、やはり微分の計算もプログラムで行う必要があるということですね。

L

Re:自然対数eを小数点第60位で表示

#23

投稿記事 by L » 17年前

ぁ あと、なんとかが1ともいってました。(難しい言葉使われた気がします。)
たぶん分子が1という意味だと思うのですが。(周りの友達もそう解釈してました。)
だから分子は1で答えが2.718...になるようにすればいいのだと思います。

たかぎ

Re:自然対数eを小数点第60位で表示

#24

投稿記事 by たかぎ » 17年前

> たぶん分子が1という意味だと思うのですが。

それは計算結果ですよね。
机上で計算しないということは、分子が1になることをプログラムで計算する必要があります。

たいちう

Re:自然対数eを小数点第60位で表示

#25

投稿記事 by たいちう » 17年前

既に書きましたが、

> 私がこの課題をやるとしたら、多倍長のクラスを用意して、
> Lさんが最初に書いた式で必要桁数を計算するプログラムを提出します。

これで十分及第点は取れると思いますよ。
私の解釈ですので、勿論保証はできませんが。
多倍長のクラスと書いたのは、私がC++に慣れているためですので、
C言語で書くならば、多倍長の必要な演算の関数群となるでしょうか。

・整数 => 多倍長(整数で初期化)
・多倍長 + 多倍長 => 多倍長
・多倍長 / 整数 => 多倍長
・多倍長を表示

これらの関数があれば解けるでしょう。
それで、今、何か分からないことはありますか?

L

Re:自然対数eを小数点第60位で表示

#26

投稿記事 by L » 17年前

e^xのマクローリン展開だったかもしれません=3
で、x=1の場合を小数点第60位までで表示。
そして、公式をつかうと

e=1/0!+1/1!+1/2!+1/3!....1/n!



ややこしくしてごめんなさい。

組木紙織

Re:自然対数eを小数点第60位で表示

#27

投稿記事 by 組木紙織 » 17年前

まずは、課題の詳細を詳しく課題を出した人に聞くことをした方がいいのかもしれませんね。

今までの流れとは少し変わるのですが、
課題の内容に
「小数第60位まで表示」
とあります。
実際の計算は置いておいて、マクローリン展開の第何項まで計算することになるんでしょうかね。
一番初めは61項までみたいでしたが、61項まで計算したら小数第60位までの値が確定すると、
いうわけではないと思うので、数値の下限はマクローリン展開で求まっても上限をどのように扱うのか
ということも問題になってくるような気がします。

単純に「小数第60位まで表示」だけなら1項だけ計算して、1.000…というのもありじゃないのかと思うのですが、その辺はどうなっているのでしょうか。

L

Re:自然対数eを小数点第60位で表示

#28

投稿記事 by L » 17年前

>多倍長の必要な演算の関数群
↑さっぱりです;;

組木紙織さん
>マクローリン展開の第何項まで計算することになるんでしょうかね
たしかにそうなんですよね
上にあげた式でnをなんまで増やせばいいかはわからないんですよね。

とりあえず作ってみて、0以外の数が入った時点で終わらせるように
作ってからnをいっこずつ減らしていこうかなって思ってます。

tk-xleader

Re:自然対数eを小数点第60位で表示

#29

投稿記事 by tk-xleader » 17年前

多倍長演算をビットレベルから実装するよりも、四則演算に関しては筆算と同じ考え方で文字列で計算するというのはどうでしょうか。
たぶんそっちのほうが楽なので…

たいちう

Re:自然対数eを小数点第60位で表示

#30

投稿記事 by たいちう » 17年前

予め第n項の大きさを計算してもいいですし、10^(-60)と比べて十分小さくなったら
終了しても良いでしょう。厳密にやろうと思えば、もう少しやりようはあると思いますが。

ところで、多倍長のイメージはつかめましたか?

L

Re:自然対数eを小数点第60位で表示

#31

投稿記事 by L » 17年前

とりあえず作ってみました!!
細かいところでいろいろ訂正すべき点はあると思いますが・・・。

あとはnの数を増やして小数点第60位まで表示できれば完成です。

#include<stdio.h>
int main(void)
{
long double sum,sum2;
int n,i;

sum2=1;/*1/0!=1を始めから入れておく*/

printf("自然対数の底e を計算します。\n");
for (n=1;n<=10;n++){/*nは項数を表す*/
	sum=1;/*sumを毎回1に直す*/
	for(i=1;i<=n;i++){/* n!=n*(n-1)*(n-2)... */

sum=sum/i;/* =(1/i)*sum   iは項の数だけ増えていく*/

	}
	printf("%lf\n",sum);/*一旦たす数を表示*/
	sum2=sum2+sum;/*1/0! + 1/1! + 1/2! + 1/3!...+1/n!を表す式*/
}
printf("%lf\n",sum2);
return (0);
}

このあとを教えてください。

L

Re:自然対数eを小数点第60位までで表示

#32

投稿記事 by L » 17年前

多倍長・・・わからなかったんで今調べてきました。
ふつーよりも多く表示できるということですね。
>・多倍長 / 整数 => 多倍長
これを見るとint と doubleの関係と同じ感じですかね?

どうやって扱うんでしょうか?


ソース?コード?を見てもらえばわかると思いますが、
使っている言語はCです。(今更ですが^^;)

lbfuvab

Re:自然対数eを小数点第60位までで表示

#33

投稿記事 by lbfuvab » 17年前

①ttp://www5.airnet.ne.jp/tomy/cpro/mpa.htmをライブラリにして使う。
②自分で定義する
どちらかです。
どちらにしても①のサイトは役に立つと思います。

L

Re:自然対数eを小数点第60位までで表示

#34

投稿記事 by L » 17年前

ありがとうございます
今見てきましたが、
多倍長というのは関数を使うんですね。

いろいろ型があるようでどれをどのように使ったらいいかわからないのですが。。。


ちなみに上にあるコードで後半を抜き出して少し修正したのが
printf("%.60f\n",sum);/*一旦たす数を表示*/
	sum2=sum2+sum;/*1/0! + 1/1! + 1/2! + 1/3!...+1/n!を表す式*/
}
printf("%.60f\n",sum2);
return (0);
}
これなんですが、
(%lf→%.60fに変更)

sumのほう(各項)を表示した場合は小数点第60位までしっかり表示されるのですが
sum2のほう(各項をたしたもの)は20桁くらいまで表示されその後0000000となってしまいます。


今のとこわかっているのは
関数を使う
#inclede<mpa.h>
を使うということだけです。。

たいちう

Re:自然対数eを小数点第60位までで表示

#35

投稿記事 by たいちう » 17年前

多倍長の例

int pi[N];
pi[0] = 3;
pi[1] = 14159;
pi[2] = 26535;
pi[3] = 89793;
pi[4] = 23846;
...

これでイメージがつかめますか?
最初に実装すべきは、初期化と表示。
初期化は配列の全てを0にすればよいでしょう。
先頭の要素に整数を入れると、その整数で初期化することになります。

次は、多倍長どうしの足し算。小学校で習った足し算の筆算を参考に、
繰り上がりを実装してください。小学校で習ったのは、10進数の筆算。
上の例は、100000進数の筆算です。

次は多倍長/整数。

これで必要なものは揃いましたので、最後にeを計算しましょう。
一歩ずつやってください。

閉鎖

“C言語何でも質問掲示板” へ戻る