/* Last edited on 2008-07-19 21:11:04 by stolfi */ /* Tests whether 5 decimals are enough for 16-bit pixels. */ #include #include #include #include #include int main(int argc, char **argv) { char *fmt = "%8.5f"; FILE *wr = fopen("/tmp/foo.bar", "w"); int N = (1<<16); int i; for (i = 0; i < N; i++) { double v = ((double)i)/((double)N); fprintf(wr, "%d ", i); fprintf(wr, fmt, v); fprintf(wr, "\n"); } fclose(wr); FILE *rd = fopen("/tmp/foo.bar", "r"); int nbugs = 0; for (i = 0; i < N; i++) { double v = ((double)i)/((double)N); double v_read; int i_read; fscanf(rd, "%d %lf", &i_read, &v_read); assert(i_read == i); int i_conv = (int)floor(v_read*N + 0.5); if (i_conv != i) { fprintf(stderr, "%d/%d --> %20.16f --> %20.16f --> %d/%d\n", i, N, v, v_read, i_conv, N); nbugs++; } } fclose(rd); if (nbugs > 0) { fprintf(stderr, "** Format «%s» IS NOT precise enough for 16-bit samples!\n", fmt); exit(1); } else { fprintf(stderr, "Yea! Format «%s» is OK for 16 bit samples!\n", fmt); exit(1); } return 0; }