
プログラムで指数関数を求めようとする際の誤差について
以下のプログラムで指数関数を求めようとした時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件)
- 最新から表示
- 回答順に表示
No.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
両方とも有効桁以下の数値なので誤差の範囲内であり、意味のない数値です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Javaで何パーセント%かを表示...
-
実数からの小数部の取得
-
IF関数でEmpty値を設定する方法。
-
オブジェクトの中のプロパティ...
-
動的配列が存在(要素が有る)か...
-
System.err. printlnとSystem.o...
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
javaです。 途中まで出来ている...
-
flush()とclose()について
-
ループ処理の際、最後だけ","を...
-
java キーボード入力された値の...
-
この警告はどうすれば?
-
JSPでHashMap・配列の変数の値...
-
java 乱数を並べて重複させない...
-
eclipseに記述したjavaファイル...
-
配列の中に複数存在する数がい...
-
javaで質問です。 文字列2023/2...
-
[JAVA]try 内の変数を外で!?
-
VBで作った乱数を一度も重複さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実数からの小数部の取得
-
double型変数値の整数部分のみ...
-
0dの意味を教えてください
-
Javaで何パーセント%かを表示...
-
最大値と最小値の求め方
-
newton法のjacobi
-
プログラマーの達人という本の...
-
先に計算したほうがいいのでし...
-
べき乗
-
Javaによる利率計算の実装方法
-
java のfor文について質問です。
-
乱数について
-
x^2+y^2<n^2
-
LU分解を利用した逆行列のプロ...
-
分を表す数値(int型)を、小数...
-
プログラムで指数関数を求めよ...
-
double型の足し算について
-
Javaコンパイルエラー
-
掛け算演算を使わない掛け算
-
乱数のdouble型について
おすすめ情報