dポイントプレゼントキャンペーン実施中!

プログラムで指数関数を求めようとする際の誤差について
以下のプログラムで指数関数を求めようとした時xを-19
以下にすると非常に大きい誤差がでます。
この原因を教えてください(正しい値を導き出す方法は知ってますのでこの原因のみの回答お願いします)

double myexp(double x){
double e=0.0,w=1.0;
int n=1;
while( 1000 >n){
e = e + w;
w = w * (x/n++);
}
return e;
}

結果
%a.out
-19
myexp :4.256655954090954081880640764730e-09
exp :5.602796437537267825983759641107e-09
%a.out
-20
myexp :6.147561828914626023583183534035e-09
exp :2.061153622438557869941517139661e-09
%a.out
-21
myexp :1.508431683113148797351905471952e-08
exp :7.582560427911906596506229561372e-10
%a.out
-22
myexp :-1.418468652124354027877889519770e-08
exp :2.789468092868924638469287369269e-10
%a.out
-23
myexp :-1.057684107493219557015354075069e-07
exp :1.026187963170189018316677204798e-10
%a.out
-24
myexp :3.443053542880998592081419080319e-07
exp :3.775134544279097726131831689486e-11
%a.out
-80
myexp :2.450820117045632320000000000000e+17
exp :1.804851387845415031401693585771e-35

A 回答 (2件)

原因はdouble型変数e,wの有効桁の問題です。



w = w * (x/n++);
の計算で、wは最初増大していき、あるときから減少していきます。
x=-24の場合、wの最大値は(-24)^24/24!=2.14963e+09となります。

double型の有効桁数は10進数で約15桁ですから、このときのwの有効桁は、少数点以下第6位までしかありません。
なので、それ以降いくら加算していっても、有効桁は少数点以下第5位までです。

x=-80の場合は、wの最大値は(-80)^80/80!=2.46872e+33なので、有効桁は少数点以上第18位までです。


x=-24のとき、
myexp :3.443053542880998592081419080319e-07
x=-80のとき、
myexp :2.450820117045632320000000000000e+17
両方とも有効桁以下の数値なので誤差の範囲内であり、意味のない数値です。
    • good
    • 0

「正しい値を導き出す方法」でなぜ正しい値が得られるのか, 理解できているんでしょうか?

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!