![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
プログラムで指数関数を求めようとする際の誤差について
以下のプログラムで指数関数を求めようとした時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で質問しましょう!
似たような質問が見つかりました
- 数学 指数関数の微分について 1 2022/05/01 11:11
- 数学 paythonを使用した周回積分に関する質問です。 2 2023/02/17 19:09
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- 工学 制御工学の問題について 1 2022/11/01 23:45
- 工学 制御工学の問題について 1 2022/11/01 09:12
- 物理学 電磁気学の問題について教えて欲しいです. 1 2023/05/05 17:01
- 物理学 量子力学 球面調和関数 導出 方位角成分 微分方程式の解 2 2022/07/02 13:40
- 物理学 同軸ケーブル 伝送の仕組み TEMモード Maxwell方程式 円柱座標 ポアソン方程式 3 2022/08/16 20:40
- 数学 数学の質問です。 関数f(t)のフーリエ変換をF(ω)=∫[-∞→∞]f(t)exp(-iωt)dt 1 2023/07/29 01:08
- C言語・C++・C# C言語 3 2022/10/04 15:07
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0dの意味を教えてください
-
Javaで何パーセント%かを表示...
-
べき乗
-
実数からの小数部の取得
-
Java言語プログラミングについ...
-
Double.parseDoubleの使い方
-
JAVAのプログラムで、2乗計算...
-
double型変数値の整数部分のみ...
-
最大値を求めるプログラム
-
プログラムのおかしいところを...
-
最大値と最小値の求め方
-
オブジェクトの中のプロパティ...
-
System.err. printlnとSystem.o...
-
ORA-01858: 数値を指定する箇所...
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
ダブルクォーテーションを含む...
-
Path型をString型へ変換する(Java)
-
C言語 重複しない4ケタの乱数...
-
[JAVA]try 内の変数を外で!?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
べき乗
-
実数からの小数部の取得
-
Javaで何パーセント%かを表示...
-
0dの意味を教えてください
-
最大値と最小値の求め方
-
double型変数値の整数部分のみ...
-
Javaによる利率計算の実装方法
-
doubleで入力するには?
-
doubleとintの違い
-
JAVAのプログラムで、2乗計算...
-
double型の足し算について
-
掛け算演算を使わない掛け算
-
実数 2.0 に対して int(2.0) ==...
-
Javaコンパイルエラー
-
java のfor文について質問です。
-
C# ToStringでの数字桁揃えの仕方
-
java プログラム 範囲を指定し...
-
Javaのeval関数処理
-
printfでのエラーがわからない...
-
数値積分について
おすすめ情報