C言語でf(x) = e^x-1の高精度な数値を求めたいですのですが、10^-15の位からどうしても値が合いません。
以下のfor文の書き方で積み残しは対処できたと思っています。
自分は桁落ちが対処できていないのかなと思います。四倍精度小数点型を使用すれば対処できるのかなとは思うのですが、使用方法がわかりません。
以下に実行結果を掲載させていただきます
【実行結果(項数100の時)】
項数 = 100
f(x) = 0.0000100000500001666682125655433166500075
解析値 =0.0000100000500000696490587870357558131218
誤差 = 0.0000000000000000970191537785075608368857
C
1#include<stdio.h> 2#include<math.h> 3 4double kaizyou(int); 5 6int main(void){ 7 int N; 8 int n; // 項数 9 int k; // 項数カウント 10double x; // e^xのx 11double xk; // x^n/n! 12double e; // テイラー展開の部分和 13double fx;//解析値 14double er; // exp(x)との差 15 16 printf("N = "); 17 scanf("%d", &N); 18 x = pow(10, -5); 19 n = pow(10, N); 20 21 printf("項数 = %d\n", n); 22 23 e = 0.0; 24 xk = 1.0; 25 26 for(k = n ; k >= 1 ; --k){ 27 e += kaizyou(k); 28 } 29 30 fx = exp(x)-1; 31 er = fabs(e-fx); 32 printf("f(x) =\t%.40f\n", e); 33 printf("解析値 =%.40f\n", fx); 34 printf("誤差 =\t%.40f\n", er); 35 36 return 0; 37} 38 39double kaizyou(int n){ 40 int i; 41 long double x = 1, d = pow(10, -5); 42 43 for(i = n ; i >= 1 ; --i){ 44 x *= d/(double)i; 45 } 46 47 return x; 48} 49
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。