本日の課題をお送りします。今回の課題は正解が一つのため、メーリングリスト には解答を流さないでください。解答は浅川個人宛 asakawa.comp2a@gmail.com まで送ってください。 件名は「20080602-自分の学生番号」として、かならず自分宛にCc: してください。
1. まず、次のプログラムを実行せよ。
ーーーーーーーーーーここからーーーーーーーーーーーーーーーー
#include <stdio.h>
#include <float.h>
int main(void)
{
float f;
double x;
long double ld;
printf("\nTesting the precision of float, double, and long double : \n");
f = 1.0f + 1.0e-7;
printf(" 1.0 + 1.0e-7 = %.10f\n", f);
f = 1.0f + 1.0e-8;
printf(" 1.0 + 1.0e-8 = %.10f\n", f);
x = 1.0l + 1.0e-15;
printf(" 1.0 + 1.0e-15 = %.20lf\n", x);
x = 1.0l + 1.0e-16;
printf(" 1.0 + 1.0e-16 = %.20lf\n", x);
ld = 1.0L + 1.0e-19;
printf(" 1.0 + 1.0e-19 = %.30Lf\n", ld);
ld = 1.0L + 1.0e-20;
printf(" 1.0 + 1.0e-20 = %.30Lf\n", ld);
printf("\nThe experiment above is explained by constants from float.h :\n");
printf(" precision of float : %e\n", FLT_EPSILON);
printf(" precision of double : %.15le\n", DBL_EPSILON);
printf(" precision of long double : %.30Le\n", LDBL_EPSILON);
return 0;
}
ーーーーーーーーーーここまでーーーーーーーーーーーーーーーー
表示された結果のうち、
1.0 + 1.0e-7 が 1.0000001
にならず、同様に
1.0 + 1.0e-15 が 1.000000000000001
にならず、
1.0 + 1.0e-19 が 1.0000000000000000001
という、きれいな数にならない理由を、FLT_EPSILON, DBL_EPSILON,
LDBL_EPSILON との関係から考察せよ。
マシンイプシロン(ε)について。2 を基数とする浮動小数点表現において、
有限桁数で表される少数の精度には限界がある。つまり少数は連続量とはならず、
離散的に表現されることとなる。この最小の離散幅をマシンイプシロンと呼ぶ。
言い換えれば、マシンイプシロンとは、1+ε>1 が成り立つ最小のεのことである。
IEEE 754 standard ではマシンイプシロンは以下の表のように定義されている。
| 精度 | 値 |
|---|---|
| 単精度 | 2-23 ≈ 1.1920928955078125 × 10-7 |
| 倍精度 | 2-52 ≈ 2.2204460492503130808472633361816 × 10-16 |
ーーーーーーーーーここからーーーーーーーーーーーーーーーーー$ ./fixed_double
ーーーーーーーーーここまでーーーーーーーーーーーーーーーーーここで 0.12345678 はキーボードから入力するものとする。
演算子(+, =, sizeof()など)が作用するものをオペランドという。