Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Do note that much greater precision can be achieved if a long double is used instead.
- //A long double version of log(), floor(), and pow() would need to be used, though.
- #include<stdio.h>
- #include <math.h>
- void store_float(FILE* f, double value, int bytes){
- bytes--;
- int is_negative = value >= 0 ? 0 : 1;
- if( value < 0 )
- value = -value;
- int power = floor(bytes*8-log(value)/log(2));
- if( power < -64 || power >= 64 || isinf(value) || isnan(value) )
- power = 63;
- value *= pow( 2, power );
- value = floor( value );
- power = (power + 64) & 0xFF;
- power |= is_negative << 7;
- fputc( power, f );
- while( value > 0 && bytes > 0 ){
- fputc( value-floor(value/256)*256, f );
- value = floor( value/256 );
- bytes--;
- }
- }
- double read_float( FILE *f, int bytes ){
- bytes--;
- int power = fgetc( f );
- int is_negative = power & 0x80;
- power &= 0x7F;
- power -= 64;
- double value = 0;
- double multiplier = 1;
- while( bytes-- > 0 ){
- value += (double)fgetc( f ) * multiplier;
- multiplier *= 256;
- }
- if( is_negative )
- value *= -1;
- value /= pow( 2, power );
- if( power == 63 )
- value = pow(2, 1024);
- return value;
- }
- int main(){
- FILE *f = fopen( "test.bin", "w" );
- store_float( f, 1080.746356, 8 );
- store_float( f, 1080.746356, 4 );
- store_float( f, 1080.746356, 2 );
- store_float( f, 1234567890123456789.123456789, 8 );
- store_float( f, 1234567890123456789.123456789, 4 );
- store_float( f, 1234567890123456789.123456789, 2 );
- store_float( f, pow(2,1024), 2 );
- fclose(f);
- f = fopen( "test.bin", "r" );
- printf("%f\n", read_float( f, 8 ));
- printf("%f\n", read_float( f, 4 ));
- printf("%f\n", read_float( f, 2 ));
- printf("%f\n", read_float( f, 8 ));
- printf("%f\n", read_float( f, 4 ));
- printf("%f\n", read_float( f, 2 ));
- printf("%f\n", read_float( f, 2 ));
- fclose(f);
- }
- /* Output:
- 1080.746356
- 1080.746338
- 1080.000000
- 1234567890123456800.000000
- 1234567802111655900.000000
- 1233986297899515900.000000
- 1.#INF00
- Contents of test.bin (hex dump, separated by stored value):
- 6D 90 65 FA 25 E2 17 87
- 4D E2 17 87
- 3D 87
- 3B 08 4C EF A3 87 10 89
- 1B 87 10 89
- 0B 89
- 7F 00
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement