Finished moving to a function like you indicated with your post:
Code:
gcc -Wall -o "test_fpn" "test_fpn.c" && "./test_fpn"
test.sig 0 mine.sig 0 test.exp 00000000 mine.exp 00000000 test.man 00000000 mine.man 00000000 test.hex 00 00 00 00 mine.hex 00 00 00 00 test.fpn 0.000000E+00 mine.fpn 0.000000E+00
test.sig 0 mine.sig 0 test.exp 0000007F mine.exp 0000007F test.man 00000000 mine.man 00000000 test.hex 00 00 80 3F mine.hex 00 00 80 3F test.fpn 1.000000E+00 mine.fpn 1.000000E+00
test.sig 0 mine.sig 0 test.exp 0000007B mine.exp 0000007F test.man 004CCCCD mine.man 003FFFFF test.hex CD CC CC 3D mine.hex FF FF BF 3F test.fpn 1.000000E-01 mine.fpn 1.500000E+00
Compilation finished successfully.
Code:
LDBL makeFPN( ullong num, ullong fpn, long exp ) {
LDBL dst = {0};
ullong one = 1;
long pos = 1;
if ( num ) {
dst.man = num;
for ( ; pos < FPNT_MAN_BIT; ++pos ) {
num /= 10;
one *= 10;
if ( !num ) break;
}
dst.exp = --pos;
}
if ( dst.man || fpn ) {
dst.exp += FPNT_EXP_MAX;
for ( ; pos < FPNT_MAN_BIT; ++pos ) {
fpn *= 2;
dst.man <<= 1;
if ( fpn >= one ) {
dst.man |= 1u;
fpn -= one;
}
}
}
pos = 0;
for ( ; pos < exp; ++pos, dst.man *= 2 );
for ( ; pos > exp; --pos, dst.man *= 2 );
if ( dst.exp ) dst.exp--;
return dst;
}
typedef struct test_val {
ullong num;
ullong fpn;
long exp;
} test_val_t;
test_val_t values[] = {{0},{1,0,0},{0,1,0}};
float floats[] = {0,1,0.1};
int main() {
int i;
LDBL test = {0}, mine = makeFPN(0,1,0);
for ( i = 0; i < 3; ++i ) {
test.fpn = floats[i];
mine = makeFPN(values[i].num, values[i].fpn,values[i].exp);
printf( "test.sig %u mine.sig %u ", test.sig, mine.sig );
printf( "test.exp %08X mine.exp %08X ", test.exp, mine.exp );
printf( "test.man %08X mine.man %08X ", test.man, mine.man );
print( "test.hex", test );
putchar(' ');
print( "mine.hex", mine );
putchar(' ');
printf("test.fpn %E mine.fpn %E\n", test.fpn, mine.fpn);
}
return 0;
}