#include #include #include #define ERROR_15 (0.000000000000001) #define ERROR_11 (0.00000000001) int main(int argc, char *argv[]){ int ret = 0; int stop = 0; FILE *f1 = NULL; FILE *f2 = NULL; long unsigned int line = 1; if(argc < 3){ fprintf(stderr, "ERROR: Wrong usage.\n"); fprintf(stderr, "Usage: %s [stop]\n", argv[0]); fprintf(stderr, "\tThis program compares 64 bit floating point numbers stored in a separate\n" "\tline each from and . If all the pairs of numbers are the\n" "\tsame up to the 15th decimal place, 0 will be returned. If not, this program\n" "\twill check if all numbers are the same up to the 11th decimal place, and\n" "\tif so 1 will be returned. If [stop] is 1, this program will stop as soon\n" "\tas this happens. If any numbers are not the same up to the 11th decimal\n" "\tplace, 2 will be returned. If [stop] is 2, this program will stop as soon\n" "\tas this happens. If there is an error while executing this program, -1 will\n" "\tbe returned, unless the error lies within the files' structures, in which\n" "\tcase 2 will be returned, as it means there was a significant difference in\n" "\tthe outputs. Compile with -DDEBUG (make debug) or define DEBUG in the program\n" "\tto print debug information.\n" ); ret = -1; goto end; } if(argc > 3){ stop = atoi(argv[3]); } f1 = fopen(argv[1], "rb"); if(!f1){ fprintf(stderr, "ERROR: Cannot open file '%s'.\n", argv[1]); ret = -1; goto end; } f2 = fopen(argv[2], "rb"); if(!f2){ fprintf(stderr, "ERROR: Cannot open file '%s'.\n", argv[2]); ret = -1; goto end; } while(!feof(f1) && !feof(f2)){ double d1, d2; if(fscanf(f1, "%lg\n", &d1) != 1){ fprintf(stderr, "ERROR: Cannot read number from file '%s' at line %lu.\n", argv[1], line); ret = 2; goto close_end; } if(fscanf(f2, "%lg\n", &d2) != 1){ fprintf(stderr, "ERROR: Cannot read number from file '%s' at line %lu.\n", argv[1], line); ret = 2; goto close_end; } double error = fabs(d1-d2); if(error >= ERROR_15){ if(error < ERROR_11){ ret = 1; }else{ ret = 2; } if(stop > 0 && stop == ret){ goto close_end; } } line++; } if((feof(f1) && !feof(f2)) || (!feof(f1) && feof(f2))){ fprintf(stderr, "ERROR: Different number of lines in files '%s' and '%s'.\n", argv[1], argv[2]); ret = 2; } close_end: fclose(f1); fclose(f2); end: #ifdef DEBUG printf("%lu lines read\n", line); printf("Return value: %d\n", ret); #endif return ret; }