Хранение представления в стороне, что-то вроде этого.
Специальные значения, такие как -0, бесконечности, NaN и т. Д., Требуют специальных
обработка хотя. Также я «забыл» реализовать отрицательные показатели.
#include <stdio.h>
#include <math.h>
const int SCALE = 1<<(52/2);
void put( double a ) {
FILE* f = fopen( "dump.txt", "wb" );
int sign = (a<0); if( sign ) a=-a;
int exp2 = 0; while( a>1 ) a/=2, exp2++;
a*=SCALE;
int m1 = floor(a);
a = (a-m1)*SCALE;
int m2 = floor(a);
fprintf(f, "%i %i %i %i\n", sign, exp2, m1, m2 );
fclose(f);
}
double get( void ) {
FILE* f = fopen( "dump.txt", "rb" );
double a;
int sign, exp2, m1, m2;
fscanf( f, "%i %i %i %i\n", &sign, &exp2, &m1, &m2 );
fclose(f);
printf( "%i %i %i %i\n", sign, exp2, m1, m2 );
a = m2; a /= SCALE;
a+= m1; a /= SCALE;
while( exp2>0 ) a*=2, exp2--;
if( a<0 ) a=-a;
return a;
}
int main( void ) {
union {
double a;
unsigned b[2];
};
a = 3.1415926;
printf( "%.20lf %08X %08X\n", a, b[0], b[1] );
put( a );
a = get();
printf( "%.20lf %08X %08X\n", a, b[0], b[1] );
}