long double 型の指数関数 expl
ウェブサイト<Long Double / Linux (Fedora 16)>で説明しているとおり、long double の取りうる値の範囲は、1.0e-4950 から 1.0e4932 ぐらいであり、精度は19桁ぐらいである。これに伴って、指数関数における独立変数の値の有効範囲がどのようであるかを以下のプログラムにより調べた。
=============================
#include <iostream>
#include <cmath>
using namespace std;
int main(){
long double xl = 0.0, yl, nyl;
do{
xl += 1.0;
yl = expl(xl);
nyl = expl(-xl);
cout << "xl = " << xl
<< " expl(xl) = " << yl
<< " expl(-xl) = " << nyl
<< endl;
}while(nyl > 0.0);
return 0;
}
=============================
Fedora 16のC++における実行結果は以下のとおりである
=============================
・
・
・
xl = 11351 expl(xl) = 4.74968e+4929 expl(-xl) = 2.10541e-4930
xl = 11352 expl(xl) = 1.2911e+4930 expl(-xl) = 7.74536e-4931
xl = 11353 expl(xl) = 3.50956e+4930 expl(-xl) = 2.84936e-4931
xl = 11354 expl(xl) = 9.53998e+4930 expl(-xl) = 1.04822e-4931
xl = 11355 expl(xl) = 2.59324e+4931 expl(-xl) = 3.85619e-4932
xl = 11356 expl(xl) = 7.04915e+4931 expl(-xl) = 1.41861e-4932
xl = 11357 expl(xl) = inf expl(-xl) = 5.21878e-4933
xl = 11358 expl(xl) = inf expl(-xl) = 1.91988e-4933
xl = 11359 expl(xl) = inf expl(-xl) = 7.06285e-4934
xl = 11360 expl(xl) = inf expl(-xl) = 2.59828e-4934
xl = 11361 expl(xl) = inf expl(-xl) = 9.55853e-4935
xl = 11362 expl(xl) = inf expl(-xl) = 3.51639e-4935
xl = 11363 expl(xl) = inf expl(-xl) = 1.29361e-4935
xl = 11364 expl(xl) = inf expl(-xl) = 4.75891e-4936
xl = 11365 expl(xl) = inf expl(-xl) = 1.75071e-4936
・
・
・
xl = 11391 expl(xl) = inf expl(-xl) = 8.94532e-4948
xl = 11392 expl(xl) = inf expl(-xl) = 3.29162e-4948
xl = 11393 expl(xl) = inf expl(-xl) = 1.21021e-4948
xl = 11394 expl(xl) = inf expl(-xl) = 4.44714e-4949
xl = 11395 expl(xl) = inf expl(-xl) = 1.64034e-4949
xl = 11396 expl(xl) = inf expl(-xl) = 6.19684e-4950
xl = 11397 expl(xl) = inf expl(-xl) = 2.18712e-4950
xl = 11398 expl(xl) = inf expl(-xl) = 7.2904e-4951
xl = 11399 expl(xl) = inf expl(-xl) = 3.6452e-4951
xl = 11400 expl(xl) = inf expl(-xl) = 0
[yasuharu@localhost LongDoubleExp]$
=============================
Expl(x)におけるxの有効範囲は、-11399 から 11356 ぐらいである。
これをdouble型のexpでも調べてみた。プログラムは以下のものである。
=============================
#include <iostream>
#include <cmath>
using namespace std;
int main(){
double x = 0.0, y, ny;
do{
x += 1.0;
y = exp(x);
ny = exp(-x);
cout << "x = " << x << " exp(x) = " << y
<< " exp(-x) = " << ny
<< endl;
}while(ny > 0.0);
return 0;
}
=============================
Fedora 16のC++による実行結果は以下のとおりである。
=============================
・
・
・
x = 700 exp(x) = 1.01423e+304 exp(-x) = 9.85968e-305
x = 701 exp(x) = 2.75697e+304 exp(-x) = 3.62717e-305
x = 702 exp(x) = 7.49422e+304 exp(-x) = 1.33436e-305
x = 703 exp(x) = 2.03714e+305 exp(-x) = 4.90884e-306
x = 704 exp(x) = 5.53752e+305 exp(-x) = 1.80586e-306
x = 705 exp(x) = 1.50525e+306 exp(-x) = 6.6434e-307
x = 706 exp(x) = 4.0917e+306 exp(-x) = 2.44397e-307
x = 707 exp(x) = 1.11224e+307 exp(-x) = 8.99086e-308
x = 708 exp(x) = 3.02338e+307 exp(-x) = 3.30755e-308
x = 709 exp(x) = 8.21841e+307 exp(-x) = 1.21678e-308
x = 710 exp(x) = inf exp(-x) = 4.47629e-309
x = 711 exp(x) = inf exp(-x) = 1.64673e-309
x = 712 exp(x) = inf exp(-x) = 6.05799e-310
x = 713 exp(x) = inf exp(-x) = 2.22861e-310
・
・
・
x = 741 exp(x) = inf exp(-x) = 1.5316e-322
x = 742 exp(x) = inf exp(-x) = 5.43472e-323
x = 743 exp(x) = inf exp(-x) = 1.97626e-323
x = 744 exp(x) = inf exp(-x) = 9.88131e-324
x = 745 exp(x) = inf exp(-x) = 4.94066e-324
x = 746 exp(x) = inf exp(-x) = 0
[yasuharu@localhost LongDoubleExp]$
=============================
double 型の指数関数exp(x)におけるxの有効範囲は、-745 から 709 ぐらいである。
long double 型を用いて計算を行い、計算結果をGUIによりグラフィカルに描画するプログラムをRADで開発するWindowsにおけるプログラミング環境としてはC++ Builderがある。