No.9
- 回答日時:
階乗の計算に int 型を使っているので オーバーフローしています。
float の有効桁数は 7桁です。double でも 15桁。
他は見ていませんが、単純に級数展開の式を使うとどんどん精度が落ちていきます。
誤差が拡大しないように計算式を工夫しましょう。
No.7
- 回答日時:
ちょっと実行してみましたがこれは
p6=kaijyo(13);
でオーバーフローしてますね。
昔作ったプログラムがあったので参考にどうぞ
double mysin(double x)
{
double EPS = 1e-08; /* 項の値がこれより小さくなったらループ終了 */
double s = 0.0; /* 求める sin 値 */
int k; /* 項数 */
int n; /* 級数(1, 3, 5, 7, ...) */
int sign = 1; /* 加算か減算かのための変数。1項ごとに符号が反転 */
double diff; /* 項の値 (x^n/n!)*sign */
int i; /* ループ用の変数 */
k = 1;
for (; ;) {
n = 2 * k - 1;
diff = 1.0;
/* x^n / n! */
for (i = 1; i <= n; i++)
{
diff *= x / i;
}
if(diff < EPS) {
break;
}
/* + or - */
diff *= sign;
s += diff;
k++;
sign *= -1;
}
return s;
}
7項で終わる場合は終了条件を k <= 7 にすればよいでしょう
No.6
- 回答日時:
> p1=kaijyo(3);
> p2=kaijyo(5);
> p3=kaijyo(7);
> p4=kaijyo(9);
> p5=kaijyo(11);
> p6=kaijyo(13);
ループの中で毎回これらを計算するのは効率が悪いです。
それから、13の階乗はint型で扱える範囲を超えてしまうため、
p6の値は正しくありません。
ロジックを見直す方がよいと思います。
この回答への補足
回答ありがとうございます。
double kaijyo(double k)
{
double seki,i;
seki=1;
for(i=1;i<=k;i++){
seki*=i;
}
return(seki);
}
と直しました。
int sum(int a,int b)
{
int ans;
ans=a+b;
return ans;
}
main()
{
z=sum(a,b);
}
のように項数と角度を渡すと値を返すような関数を作成したいのですが、項数と角度の渡し方(上記でいうz=sum(a,b))をどのように変えればいいかわかりません。ヒントでもいいので教えてください。
No.4
- 回答日時:
級数展開部分のプログラムを見せてもらえませんか
おそらく角度がラジアンになっていないのではないでしょうか
組み込み関数は
#include <math.h>
で使えるようになる
double sin(double x)
のことです。
この関数の値と自作関数(例えばmysin( ))の値の差を求めよということなので
mysin(x) - sin(x)の値をプリントすればよいでしょう
この回答への補足
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
main()
{
int kaijyo(int k);
int i,p1,p2,p3,p4,p5,p6;
float deg,z,a,x;
float pi=3.1415926535897932384626433832795;
for(i=0;i<=360;i+=5){
p1=kaijyo(3);
p2=kaijyo(5);
p3=kaijyo(7);
p4=kaijyo(9);
p5=kaijyo(11);
p6=kaijyo(13);
x=pi*i/180;
z=x-pow(x,3/p1)+pow(x,5/p2)-pow(x,7/p3)+pow(x,9/p4)-pow(x,11/p5)+pow(x,13/p6);
printf("%d,%f\n",i,z);
}
getch();
exit(0);
}
int kaijyo(int k)
{
int seki,i;
seki=1;
for(i=1;i<=k;i++){
seki*=i;
}
return(seki);
}
実行結果の前にpow: DOMAIN errorとなっているので、powの使い方が間違っているのでしょうか?
No.3
- 回答日時:
1. sin xの級数展開がわからない
2. 7項まで取った場合がわからない
3. 組み込み関数がわからない
4. 値の差を求めるのがわからない
5. 0度から360度までがわからない
6. プログラムの作成がわからない
なにがわからないのでしょうか。
ここでは問題の丸投げはだめです。
自分である程度プログラムを書いてそれを書き込むと回答率が上がります。
この回答への補足
回答ありがとうございます。
とりあえずsinxの級数展開部分のプログラムを作ってみたのですが、電卓でsinxを計算した場合と0から90°はほぼ等しいのですが、90から180の値は減少せずに増加し、180から360°はマイナスの値が出てこず、電卓の値と全く違ってわかりません。
3と4もわかりません。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
doubleの変数にintとintの割り...
-
プログラムでの数字につく”f”の...
-
C言語 関数プロトタイプ宣言の...
-
漸化式のプログラム
-
C言語を実行すると-infが出てき...
-
difftime()について
-
文字列をfloatで読み込む(atoi,...
-
インデックスが配列の境界外です.
-
二次関数で
-
マチンの公式による円周率のプ...
-
C++で外積
-
float?数字の後にLがつくもの
-
C++ による指数乱数発生プログ...
-
C言語 正弦関数の級数展開のプ...
-
斜辺と角度て底辺と高さを出したい
-
doubleは常に%lfとするべきなのか
-
2自由度減衰振動のルンゲクッタ法
-
C++初心者です。簡単なスコア計...
-
float型とdouble型の変数の違い...
-
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分法を用いて解くプロ...
おすすめ情報