本日の課題をお送りします。今回の課題は正解が一つのため、メーリングリスト には解答を流さないでください。解答は浅川個人宛 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()
など)が作用するものをオペランドという。