
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ランキング
-
プログラムでの数字につく”f”の...
-
c言語で、繰り返し文の中で、0....
-
doubleの変数にintとintの割り...
-
数値を指数部と仮数部に分離したい
-
^この記号を使わない
-
C言語でsqrt(a^2+b^2)のテーブ...
-
doubleは常に%lfとするべきなのか
-
至急です! マクロ定義で #defi...
-
C 開放してるのにエラー(doubl...
-
最早開始時間と最遅完了時刻を...
-
【C++】関数ポインタの使い方
-
既定のコンストラクタがありま...
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
a^2の√=a が成り立たない場合
-
VB6.0での小数点の扱いについて
-
配列をnビットシフトする
-
数学 一次関数 関数 y=-3/4x+k(...
-
c languageで 簡単な質問があ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
c言語で、繰り返し文の中で、0....
-
doubleの変数にintとintの割り...
-
至急です! マクロ定義で #defi...
-
C言語 関数プロトタイプ宣言の...
-
浮動小数点の定数
-
DWORDの警告
-
C言語の型による処理速度の違い
-
C言語で台形公式を使った二重積...
-
C言語を実行すると-infが出てき...
-
int とdoubleの比較
-
C言語初心者 構造体 課題について
-
たくさんの数の平均を求める方...
-
EXE1→DLL→EXE2数値を受け渡す方法
-
プログラミングでのテイラー展開
-
C++初心者です。簡単なスコア計...
-
【C言語】二階微分方程式をル...
-
fgets()による繰り返し入力(c言語)
-
2分法で方程式の複数の解を自...
おすすめ情報