#include <stdio.h>

#define COUNT(type, result_m, result_e) do { \
  type x = 1, exp; \
  unsigned res, e; \
  for (res=0; x!=0; ++res) x/=2.; \
  for (exp=1,e=0; exp*2<res; ++e) exp*=2; \
  *result_e = e+1; \
  *result_m = res-exp+1; \
} while(0)

int main(void)
{
  unsigned f_m, f_e, d_m, d_e, ld_m, ld_e;
  
  COUNT(float, &f_m, &f_e);
  COUNT(double, &d_m, &d_e);
  COUNT(long double, &ld_m, &ld_e);
  
  printf("              S   M   E   SZ\n");
  printf("float:        1  %2u  %2u  %3u\n",  f_m,  f_e, 8 * sizeof(float));
  printf("double:       1  %2u  %2u  %3u\n",  d_m,  d_e, 8 * sizeof(double));
  printf("long double:  1  %2u  %2u  %3u\n", ld_m, ld_e, 8 * sizeof(long double));
}
