Advertisement
Guest User

Untitled

a guest
Jan 17th, 2017
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. typedef union {
  2.     float f;
  3.     uint32_t u32;
  4.     struct {
  5.         uint32_t m:23;
  6.         uint32_t x:8;
  7.         uint32_t s:1;
  8.     };
  9. } f_un;
  10.  
  11.  
  12. void put_f32(float f32){
  13.     f_un fun;
  14.     uint32_t uv[10], mlsft, m, x, a, b, z, c;
  15.     int i;
  16.     char pad[40], *pp;
  17.     union {
  18.         uint64_t u64;
  19.         uint32_t u32[2];
  20.     } u6432;
  21.     union {
  22.         uint32_t u32;
  23.         uint16_t u16[2];
  24.     } d, t;
  25.  
  26.     fun.f = f32;
  27.     if(fun.x == 0xFF){
  28.         if(fun.m == 0){
  29.             if(fun.s)
  30.                 putchar('-');
  31.             putchar('i');
  32.             putchar('n');
  33.             putchar('f');
  34.         } else {
  35.             putchar('N');
  36.             putchar('a');
  37.             putchar('N');
  38.         }
  39.         return;
  40.     }
  41.     if(fun.s)
  42.         putchar('-');
  43.  
  44.     x = fun.x - 127;
  45.     m = fun.m;
  46.     if(fun.x){
  47.         m = fun.m | 1 << 23;
  48.     } else {
  49.         x++;
  50.     }
  51.     mlsft = x + 160 - 23;
  52.     for(i = 0; i < 10; i++){
  53.         uv[i] = 0;
  54.     }
  55.  
  56.     a = mlsft >> 5;
  57.     b = mlsft & 0x1F;
  58.     uv[a] = m << b;
  59.     if(b)
  60.         uv[a + 1] = m >> (32 - b);
  61.  
  62.     pp = pad;
  63.     b = a + 1;
  64.     do {
  65.         for(i = b, c = z = 0; i >= 5; i--){
  66.             t.u32 = uv[i];
  67.             d.u16[1] = c;
  68.             d.u16[0] = t.u16[1];
  69.             t.u16[1] = d.u32 / 10;
  70.             c = d.u32 % 10;
  71.  
  72.             d.u16[1] = c;
  73.             d.u16[0] = t.u16[0];
  74.             t.u16[0] = d.u32 / 10;
  75.             c = d.u32 % 10;
  76.  
  77.             uv[i] = t.u32;
  78. /*
  79.             u6432.u32[1] = c;
  80.             u6432.u32[0] = uv[i];
  81.             uv[i] = u6432.u64 / 10;
  82.             c = u6432.u64 % 10;
  83. */
  84.  
  85.             if(i == b && uv[i] == 0)
  86.                 b--;
  87.             z |= uv[i];
  88.         }
  89.         *pp++ = c + '0';
  90.     } while(z);
  91.     while(--pp >= pad)
  92.         putchar(*pp);
  93.  
  94.     putchar('.');
  95.  
  96.     b = a;
  97.     do {
  98.         for(i = b, c = z = 0; i < 5; i++){
  99.             u6432.u64 = (uint64_t) uv[i] * 10;
  100.             uv[i] = u6432.u32[0] + c;
  101.             c = u6432.u32[1];
  102.             if(i == b && uv[i] == 0)
  103.                 b++;
  104.             z |= uv[i];
  105.         }
  106.         putchar(c + '0');
  107.     } while(z);
  108.  
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement