- 締切済み
指数関数の求め方
以下の二つのプログラムは指数関数を求めるものですが、前者ではxに-19以下の値を入れた際にまったく異なる解をだします。 これの原因を教えてください。 ----------------------------------------------------------- double myexp(double x){ double e=0.0,w=1.0; int n=1; while( n<1000){ e = e + w; w = w * (x/n++); } return e; } ----------------------------------------------------------- double myexp(double x){ double e=0.0,w=1.0; int n=1,f=0; if(x < 0){ f = 1; x = -x; } while(n<1000){ e = e + w; w = w * (x/n++); } if(f == 1){ e = 1 / e; } return e; } -----------------------------------------------------------
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- himajin100000
- ベストアンサー率54% (1660/3060)
どうやら俺の目は節穴のようだ。再現していた…orz
- 500cii
- ベストアンサー率50% (14/28)
exp(-19)はだいたいe-9のオーダーになります。 wはループ中で最大でe+7の値になります。 ところでdouble型の有効桁数は10進で約16桁です。 従ってwがe+7のオーダーの時、減算においてe-9(=7-16)の位の部分は誤差によって正確な値にはなりません。 と言うわけで上の方の式が誤った結果を出します。 eとwをlong double型で宣言すればexp(-19)も、有効桁数が増えるので妥当な値になると思います。