2017-02-17 7 views
-2

指数に対するテイラー級数の計算精度についてアドバイスできますか?指数の度合いと精度の数値が入力データとして計算されます。与えられた精度を持つ計算番号を出力データとして受け取る必要があります。私はプログラムを書いたが、答えを計算して埋め込み関数の答えと比較すると、それは異なっている。あなたは私に助言をすることができます、どのように私は回答の違いを破壊することができますか? formula of exponent's calculatingC++:計算の精度について(コードが入っています)

#include "stdafx.h" 
#include "iostream" 
#include <math.h> 
#include <Windows.h> 
#include <stdlib.h> 

using namespace std; 

int Factorial(int n); 
double Taylor(double x, int q); 
int main() 
{ 
    double res = 0; 
    int q = 0; 
    double number = 0; 
    cout << "Enter positive number" << "\n"; 
    cin >> number; 
    cout << "Enter rounding error (precision)" << "\n"; 
    cin >> q; 
    cout << "\n" << "\n"; 
    res = Taylor(number, q); 
    cout << "Answer by Taylor : " << res; 
    cout << "Answer by embedded function: " << exp(number); 
    Sleep(25000); 

    return 0; 
} 

int Factorial(int n) {    
    int res = 1; 
    int i = 2; 
    if (n == 1 || n == 0) 
     return 1; 
    else 
    { 
     while (i <= n) 
     { 
      res *= i; 
      i++; 
     } 
     return res; 
    } 
} 

double Taylor(double x, int q) { 
    double res = 1; 
    double res1 = 0; 
    int i =1; 
    while (i) 
    { 
     res += (pow(x, i)/Factorial(i)); 
     if (int(res*pow(10, q)) < (res*pow(10, q))) 
     {//rounding res below 
      if ((int (res * pow(10,q+1)) - int(res*pow(10, q))) <5) 
       res1 = (int(res*pow(10, q))) * pow(10, (-q)); 
      else 
       res1 = (int(res*pow(10, q))) * pow(10, (-q)) + pow(10,-q); 

      return res1; 

     } 

     i++; 

    } 


} 
+0

違いは何ですか?どのような機能を拡張しようとしていますか? – user463035818

+0

テイラーの関数を組み込み関数のように正確にしたいです。たとえば、変数を入力してみると、回答の違いが表示されます。 – tryuf

+0

あなたが得た結果は何ですか?あなたが得たいものとはどのように異なっていますか? – user463035818

答えて

1

コードには2つの問題があります。まず、階乗は非常にオーバーフローする傾向があります。実際には、int階乗のオーバーフローが発生したときはわかりませんが、通常のポケット電卓の場合などは、x==70のためにすでにオーバーフローしています。あなたはおそらくその高階乗を必要としませんが、それは最初から問題を回避する方が良いです。各ステップで追加する必要がある修正を見てみると、x^i/i!(数式表記)の場合、この値は実際にはそれぞれx^iまたはi!よりはるかに小さいことがわかります。また、前の値から簡単に値を計算するには、単にx/iを掛けるだけです。

第2に、精度に関する計算がわかりません。たぶんそれは正解ですが、正直言ってそれを理解しようとするには複雑すぎます。私はあなたが必要な反復の数に注意を払う必要があるとして、結果を返すために、構造体を使用

#include <iostream> 
#include <cmath> 

struct taylor_result { 
     int iterations; 
     double value; 
     taylor_result() : iterations(0),value(0) {} 
}; 

taylor_result taylor(double x,double eps = 1e-8){ 
    taylor_result res; 
    double accu = 1;       // calculate only the correction 
               // but not its individual terms 
    while(accu > eps){       
     res.value += accu; 
     res.iterations++; 
     accu *= (x/(res.iterations)); 
    } 
    return res; 
}  

int main() { 
    std::cout << taylor(3.0).value << "\n"; 
    std::cout << exp(3.0) << "\n"; 
} 

注:ここでは

は、あなたが正しい値を得ることができる方法です。

PS:hereを参照してください。これにより、すでに計算された結果を使用してシリーズを継続して精度を向上させることができます。 Imhoの素晴らしいソリューションは、反復回数の制限を設定する方法を提供する必要がありますが、これは実装するために残します)

関連する問題