Guest User

float_to_str

a guest
Jan 18th, 2017
71
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. void f32_to_str(float f32, char *str){
  12.     f_un fun;
  13.     uint32_t uv[10], mlsft, m, x, a, b, z, c;
  14.     int i;
  15.     char *pp, *pe, swap;
  16.     union {
  17.         uint64_t u64;
  18.         uint32_t u32[2];
  19.     } u6432;
  20.     union {
  21.         uint32_t u32;
  22.         uint16_t u16[2];
  23.     } d, t;
  24.  
  25.     fun.f = f32;
  26.     if(fun.x == 0xFF){
  27.         if(fun.m == 0){
  28.             if(fun.s)
  29.                 *str++ = '-';
  30.             strcpy(str, "inf");
  31.         } else {
  32.             strcpy(str, "nan");
  33.         }
  34.         return;
  35.     }
  36.     if(fun.s)
  37.         *str++ = '-';
  38.  
  39.     x = fun.x - 127;
  40.     m = fun.m;
  41.     if(fun.x){
  42.         m = fun.m | 1 << 23;
  43.     } else {
  44.         x++;
  45.     }
  46.     mlsft = x + 160 - 23;
  47.     for(i = 0; i < 10; i++){
  48.         uv[i] = 0;
  49.     }
  50.  
  51.     a = mlsft >> 5;
  52.     b = mlsft & 0x1F;
  53.     uv[a] = m << b;
  54.     if(b)
  55.         uv[a + 1] = m >> (32 - b);
  56.  
  57.     pp = str;
  58.     b = a + 1;
  59.     do {
  60.         for(i = b, c = z = 0; i >= 5; i--){
  61.             t.u32 = uv[i];
  62.             d.u16[1] = c;
  63.             d.u16[0] = t.u16[1];
  64.             t.u16[1] = d.u32 / 10;
  65.             c = d.u32 % 10;
  66.  
  67.             d.u16[1] = c;
  68.             d.u16[0] = t.u16[0];
  69.             t.u16[0] = d.u32 / 10;
  70.             c = d.u32 % 10;
  71.  
  72.             uv[i] = t.u32;
  73. /*
  74.             u6432.u32[1] = c;
  75.             u6432.u32[0] = uv[i];
  76.             uv[i] = u6432.u64 / 10;
  77.             c = u6432.u64 % 10;
  78. */
  79.  
  80.             if(i == b && uv[i] == 0)
  81.                 b--;
  82.             z |= uv[i];
  83.         }
  84.         *str++ = c + '0';
  85.     } while(z);
  86.  
  87.     pe = str - 1;
  88.     while(pe > pp){
  89.         swap = *pe;
  90.         *pe-- = *pp;
  91.         *pp++ = swap;
  92.     }
  93.  
  94.     *str++ = '.';
  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.         *str++ = c + '0';
  107.     } while(z);
  108.  
  109.     *str = 0;
  110. }
RAW Paste Data