small.c |
/* * small.c */ #include <stdio.h> #include "bdsd.h" int main() { int i; double x; bdsd s; x = 1; for (i = 1; i <= 1080; i++) { double_to_bin_digits(x, s); printf("2^{-%-4d}=", i-1); print_bdsd(s); printf("\n=%25.20e\n", x); x /= 2; } return 0; } |
要するに から始めて、 倍していった数の 進表現を表示している。
までは 正規化浮動小数点数として表現できるが、 それ以降は非正規化浮動小数点数になり、 が正の 最小の浮動小数点数で、その後は にアンダーフローする。
takebe% ./small 2^{-0 }=0 01111111111 0000000000000000000000000000000000000000000000000000 =1.00000000000000000000e+00 2^{-1 }=0 01111111110 0000000000000000000000000000000000000000000000000000 =5.00000000000000000000e-01 2^{-2 }=0 01111111101 0000000000000000000000000000000000000000000000000000 =2.50000000000000000000e-01 2^{-3 }=0 01111111100 0000000000000000000000000000000000000000000000000000 =1.25000000000000000000e-01 2^{-4 }=0 01111111011 0000000000000000000000000000000000000000000000000000 =6.25000000000000000000e-02 中略 2^{-1019}=0 00000000100 0000000000000000000000000000000000000000000000000000 =1.78005908680576110647e-307 2^{-1020}=0 00000000011 0000000000000000000000000000000000000000000000000000 =8.90029543402880553236e-308 2^{-1021}=0 00000000010 0000000000000000000000000000000000000000000000000000 =4.45014771701440276618e-308 2^{-1022}=0 00000000001 0000000000000000000000000000000000000000000000000000 =2.22507385850720138309e-308 ↑これが最小の正規化浮動小数点数、これ以降は仮数部に 1 が現れ、シフトしていく 2^{-1023}=0 00000000000 1000000000000000000000000000000000000000000000000000 =1.11253692925360069155e-308 2^{-1024}=0 00000000000 0100000000000000000000000000000000000000000000000000 =5.56268464626800345773e-309 2^{-1025}=0 00000000000 0010000000000000000000000000000000000000000000000000 =2.78134232313400172886e-309 2^{-1026}=0 00000000000 0001000000000000000000000000000000000000000000000000 =1.39067116156700086443e-309 中略 2^{-1071}=0 00000000000 0000000000000000000000000000000000000000000000001000 =3.95252516672997235341e-323 2^{-1072}=0 00000000000 0000000000000000000000000000000000000000000000000100 =1.97626258336498617671e-323 2^{-1073}=0 00000000000 0000000000000000000000000000000000000000000000000010 =9.88131291682493088353e-324 2^{-1074}=0 00000000000 0000000000000000000000000000000000000000000000000001 =4.94065645841246544177e-324 ↑これが正の最小の浮動小数点数 (仮数部のはしっこに風前の灯火ビットが見える) 2^{-1075}=0 00000000000 0000000000000000000000000000000000000000000000000000 =0.00000000000000000000e+00 ↑アンダー・フローしてオール・ゼロになった。 後略 takebe% |
桂田 祐史