みけCAT さんが書きました:自分が書いたように、変数宣言の所で初期化をしてkのループ内ではkaiにkの階乗ではなくkを掛けるようにすることで、
正しい結果を得つつ、毎回階乗を計算するよりステップ数を減らすことができます。
第k項は (2x)
k / k! です。
質問者の t_n_y_09さんは、これをそのままコード化しようとしたんでしょう。
コード:
bb = 2 * x;
for (k = 1; ; k += 1) {
bb2 = pow(bb, k);
kai = factorial(k);
kou = bb2 / kai;
階乗の関数 factorial はないから、forループを使った。
みけCATさんは、一つ前の項の計算で使用した kai を使えば
ステップ数が減らせるとして、次のようにした。
コード:
double kai = 1;
bb = 2 * x;
for (k = 1; ; k += 1) {
bb2 = pow(bb, k);
kai *= k;
kou = bb2 / kai;
それなら、pow も使わないほうが良いでしょう。
コード:
double bb2 = 1;
double kai = 1;
bb = 2 * x;
for (k = 1; ; k += 1) {
bb2 *= bb;
kai *= k;
kou = bb2 / kai;
さらに、次のようにすることができます。
コード:
double kou = 1;
bb = 2 * x;
for (k = 1; ; k += 1) {
kou *= bb2 / k;
私は、最初の回答の別解でこれを示しました。
コード:
double y = 1, t = 1; // y は元の ans。t は term(項) で、元の kou
for (int k = 1; y != y - t; k++)
y += t *= 2 * x / k; // 2 * x は bb のように一つの変数にしたほうがよいかな?
終了条件を、t がゼロになるまでとすると、k = 171 になります。
y が一つ前の y と等しくなるまでとすると、k = 46 になって、
ステップ数が大きく減少します。x = 5 の場合ですが。
[quote="みけCAT" id=3,19181,145300]自分が書いたように、変数宣言の所で初期化をしてkのループ内ではkaiにkの階乗ではなくkを掛けるようにすることで、
正しい結果を得つつ、毎回階乗を計算するよりステップ数を減らすことができます。[/quote]
第k項は (2x)[sup]k[/sup] / k! です。
質問者の t_n_y_09さんは、これをそのままコード化しようとしたんでしょう。
[code=c]
bb = 2 * x;
for (k = 1; ; k += 1) {
bb2 = pow(bb, k);
kai = factorial(k);
kou = bb2 / kai;
[/code]
階乗の関数 factorial はないから、forループを使った。
みけCATさんは、一つ前の項の計算で使用した kai を使えば
ステップ数が減らせるとして、次のようにした。
[code=c]
double kai = 1;
bb = 2 * x;
for (k = 1; ; k += 1) {
bb2 = pow(bb, k);
kai *= k;
kou = bb2 / kai;
[/code]
それなら、pow も使わないほうが良いでしょう。
[code=c]
double bb2 = 1;
double kai = 1;
bb = 2 * x;
for (k = 1; ; k += 1) {
bb2 *= bb;
kai *= k;
kou = bb2 / kai;
[/code]
さらに、次のようにすることができます。
[code=c]
double kou = 1;
bb = 2 * x;
for (k = 1; ; k += 1) {
kou *= bb2 / k;
[/code]
私は、最初の回答の別解でこれを示しました。
[code=c]
double y = 1, t = 1; // y は元の ans。t は term(項) で、元の kou
for (int k = 1; y != y - t; k++)
y += t *= 2 * x / k; // 2 * x は bb のように一つの変数にしたほうがよいかな?
[/code]
終了条件を、t がゼロになるまでとすると、k = 171 になります。
y が一つ前の y と等しくなるまでとすると、k = 46 になって、
ステップ数が大きく減少します。x = 5 の場合ですが。