Skip to content

Instantly share code, notes, and snippets.

@riicchhaarrd
Last active August 18, 2021 21:50
Show Gist options
  • Select an option

  • Save riicchhaarrd/c1f9217ad46c6bde118a58e14a54c97d to your computer and use it in GitHub Desktop.

Select an option

Save riicchhaarrd/c1f9217ad46c6bde118a58e14a54c97d to your computer and use it in GitHub Desktop.
c print single precision floating point IEEE 754 little endian
#include <stdio.h>
unsigned int u32pow( unsigned int x, unsigned int y )
{
if(y == 0)
return 1;
for ( unsigned int i = 1; i < y; ++i )
x += x;
return x;
}
void extract_754_single(int value, int *mantissa, int *exp, int *sign)
{
*sign = (value & (1 << 31)) != 0 ? -1 : 1;
*exp = value;
*exp &= ~(1 << 31);
*exp &= ~0x7fffff;
*exp >>= 23;
*exp -= 127;
*mantissa = value & 0x7fffff;
}
void convert_754_single(int value, int *integer, int *frac)
{
int mantissa, exp, sign;
extract_754_single(value, &mantissa, &exp, &sign);
int pow = 1;
int m = 10000;
int total = m;
for ( int i = 9; i < 32; ++i )
{
int set = ( mantissa & ( 1 << ( 32 - i - 1 ) ) );
int p = m / u32pow(2, pow);
if(!p) break;
if ( set )
total += p;
++pow;
}
if ( exp > 0 )
total *= u32pow( 2, exp );
else
total /= u32pow( 2, -exp );
*integer = (total / m) * sign;
*frac = total % m;
}
int build_754_single( int mantissa, int exp, int neg )
{
int f = 0;
if ( neg )
f |= ( 1 << 31 );
f |= ( ( ( exp + 127 ) & 0xff ) << 23 );
f |= ( mantissa & 0x7fffff );
return f;
}
int main()
{
float flt = 3.14382;
int f = *(int*)&flt;
//int f = build_754( 7913472, 7, 1 );
int m, e, n;
extract_754_single( f, &m, &e, &n );
printf( "m=%d,e=%d,n=%d\n", m, e, n );
int integer, frac;
convert_754_single(f, &integer, &frac);
printf("approx: %d.%d\n", integer, frac);
/*
output:
m=4797529,e=1,n=0
approx: 3.14381998
*/
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment