Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- uib fxs(char* pd, uint sz, float value)
- {
- char* p = pd;
- // Special cases.
- if((*((uid*) &value) & 0x7F800000)-1 >= (0x7F800000-1))
- {
- }
- // Common
- const sid exp = FXS_EXPONENT(value) - FLT_MANTISSA_BITS;
- const sid shift = FXS_PRECISION_BITS + exp - 4;
- const uiq mantissa = FXS_MANTISSA_NLZ(value);
- /*
- * Convert integer component
- *
- */
- uiq integer;
- if(exp > 0)
- {
- integer = mantissa << exp;
- }
- else if(exp < 0)
- {
- if(-exp > FLT_MANTISSA_BITS)
- {
- *p++ = '0';
- *p++ = '.';
- goto FRACTION;
- }
- integer = mantissa >> (-exp);
- }
- else
- {
- integer = mantissa;
- }
- p += uiqxs(p, 32, integer);
- *p++ = '.';
- FRACTION:
- /*
- * Convert fractional
- *
- */
- if(shift >= FXS_PRECISION_BITS-4 || shift <= 0)
- {
- *p++ = '0';
- }
- else
- {
- uiq fraction = mantissa << shift;
- uib digits = 0;
- char c;
- for(uib i = 0; fraction && i < FXS_PRECISION_DIGITS; i++)
- {
- fraction &= 0x0fffffffffffffffllu;
- fraction *= 10;
- p[i] = (c = '0' + (fraction >> (FXS_PRECISION_BITS-4)));
- if(c)
- digits++;
- }
- p += digits;
- }
- DONE:
- *p = '\0';
- return (p-pd);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement