Last active
August 18, 2021 21:50
-
-
Save riicchhaarrd/c1f9217ad46c6bde118a58e14a54c97d to your computer and use it in GitHub Desktop.
c print single precision floating point IEEE 754 little endian
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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