Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- typedef union {
- float f;
- uint32_t u32;
- struct {
- uint32_t m:23;
- uint32_t x:8;
- uint32_t s:1;
- };
- } f_un;
- void put_f32(float f32){
- f_un fun;
- uint32_t uv[10], mlsft, m, x, a, b, z, c;
- int i;
- char pad[40], *pp;
- union {
- uint64_t u64;
- uint32_t u32[2];
- } u6432;
- union {
- uint32_t u32;
- uint16_t u16[2];
- } d, t;
- fun.f = f32;
- if(fun.x == 0xFF){
- if(fun.m == 0){
- if(fun.s)
- putchar('-');
- putchar('i');
- putchar('n');
- putchar('f');
- } else {
- putchar('N');
- putchar('a');
- putchar('N');
- }
- return;
- }
- if(fun.s)
- putchar('-');
- x = fun.x - 127;
- m = fun.m;
- if(fun.x){
- m = fun.m | 1 << 23;
- } else {
- x++;
- }
- mlsft = x + 160 - 23;
- for(i = 0; i < 10; i++){
- uv[i] = 0;
- }
- a = mlsft >> 5;
- b = mlsft & 0x1F;
- uv[a] = m << b;
- if(b)
- uv[a + 1] = m >> (32 - b);
- pp = pad;
- b = a + 1;
- do {
- for(i = b, c = z = 0; i >= 5; i--){
- t.u32 = uv[i];
- d.u16[1] = c;
- d.u16[0] = t.u16[1];
- t.u16[1] = d.u32 / 10;
- c = d.u32 % 10;
- d.u16[1] = c;
- d.u16[0] = t.u16[0];
- t.u16[0] = d.u32 / 10;
- c = d.u32 % 10;
- uv[i] = t.u32;
- /*
- u6432.u32[1] = c;
- u6432.u32[0] = uv[i];
- uv[i] = u6432.u64 / 10;
- c = u6432.u64 % 10;
- */
- if(i == b && uv[i] == 0)
- b--;
- z |= uv[i];
- }
- *pp++ = c + '0';
- } while(z);
- while(--pp >= pad)
- putchar(*pp);
- putchar('.');
- b = a;
- do {
- for(i = b, c = z = 0; i < 5; i++){
- u6432.u64 = (uint64_t) uv[i] * 10;
- uv[i] = u6432.u32[0] + c;
- c = u6432.u32[1];
- if(i == b && uv[i] == 0)
- b++;
- z |= uv[i];
- }
- putchar(c + '0');
- } while(z);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement