| 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%
|
桂田 祐史