4 絶対値の小さな数

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;
}

要するに $1$ から始めて、 $1/2$ 倍していった数の $2$ 進表現を表示している。

$2^{-1022}\kinji 2.2250738585072014\times 10^{-308}$ までは 正規化浮動小数点数として表現できるが、 それ以降は非正規化浮動小数点数になり、 $2^{-1074}\kinji 4.94065645841246544\times 10^{-324}$ が正の 最小の浮動小数点数で、その後は $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%

桂田 祐史
2019-01-20