Long Double / Linux (Fedora 16)
Fedora 16において long double 型の精度と取りうる値の範囲を調べてみた。
まず、範囲を次のプログラムでチェックした。
======================================
#include <iostream>
using namespace std;
int main(){
long double x = 1.0, y = 1.0;;
do {
x *= 0.1;
y *= 10.0;
cout << "x = " << x << " y = " << y << endl;
}while(x > 0.0);
return 0;
}
======================================
実行結果は以下のようになった。
=====================================
・
・
・
x = 1e-4929 y = 1e+4929
x = 1e-4930 y = 1e+4930
x = 1e-4931 y = 1e+4931
x = 1e-4932 y = 1e+4932
x = 1e-4933 y = inf
x = 1e-4934 y = inf
x = 1e-4935 y = inf
x = 1e-4936 y = inf
x = 1e-4937 y = inf
x = 1e-4938 y = inf
x = 1e-4939 y = inf
x = 1e-4940 y = inf
x = 1e-4941 y = inf
x = 1e-4942 y = inf
x = 1e-4943 y = inf
x = 1e-4944 y = inf
x = 9.99999e-4946 y = inf
x = 9.99988e-4947 y = inf
x = 9.99878e-4948 y = inf
x = 9.98785e-4949 y = inf
x = 9.84204e-4950 y = inf
x = 1.09356e-4950 y = inf
x = 0 y = inf
[yasuharu@localhost check2]$
=====================================
long double の取りうる値の範囲は、1.0e-4950 から 1.0e4932 ぐらいである。
次に精度を次のプログラムで調べてみた。
====================================
#include <iostream>
using namespace std;
int main(){
long double x = 1.0, y = 1.0, z;
do{
y *= 0.1;
z = x + y;
cout << y << endl;
} while(z > x);
return 0;
}
====================================
実行結果は以下のようになった。
===================================
[yasuharu@localhost check2]$ g++ -o check1 CheckLongDouble1.cpp
[yasuharu@localhost check2]$ ./check1
0.1
0.01
0.001
0.0001
1e-05
1e-06
1e-07
1e-08
1e-09
1e-10
1e-11
1e-12
1e-13
1e-14
1e-15
1e-16
1e-17
1e-18
1e-19
1e-20
[yasuharu@localhost check2]$
===================================
long double 型の精度は19桁ぐらいである。
なお、「g++」のインストールは
su コマンドを実行してから
yum groupinstall “Development Tools”
と実行すると行うことができ、「g++」が使えるようになる。Development と Tools の間に空白文字が入っているので、全体を ” と ” で囲む。
定数をlong double型に設定するときは、定数の最後に英字Lを付ける。英字Lが付いていないときは、double型に四捨五入される。このことは、図1に示されているプログラムとその実行結果を見ることでもわかる。
図1
double 型に対してlong double 型を用いた場合の指数関数に対する有効な独立変数の値の範囲はウェブサイト<long double 型の指数関数expl>で説明している。