Up

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 16C++における実行結果は以下のとおりである

=============================

             

             

             

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 16C++による実行結果は以下のとおりである。

=============================

             

             

             

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がある。

 

Up