int main(void) { FILE *fp; union data_32bit a, n, result, correct; char a_str[33]; int count_mistake = 0; //誤答数をカウント int count_1bit_diff = 0; //1bitずれをカウント memset(a_str, '\0', 33); if ((fp = fopen("testcase.txt", "r")) == NULL) { printf("file open error.\n"); exit(EXIT_FAILURE); } while(fscanf(fp, "%s", a_str) != EOF) { a.uint32 = str_to_uint32t(a_str); n.uint32 = normalize(a.uint32); result.uint32 = finv(a.uint32); correct.fl32 = 1.0 / n.fl32; //非正規仮数を0に潰す if (n.uint32 != a.uint32 && count_mistake <= 10) { //printf("normalized!!!!!\n"); //debug } if (equal(result.uint32, correct.uint32) == 1) { //何もしない } else if (equal(result.uint32, correct.uint32) == 2) { count_1bit_diff++; //show_testcase(a, result, correct); } else { //printf("0\n"); //一致しなければ0 count_mistake++; if (count_mistake <= 5) { show_testcase(a, result, correct); } if (count_mistake == 5) { printf("more than 5 mistakes.\n"); } } memset(a_str, '\0', 33); } printf("total ~%dbit_diff : %d\n", PERMIT, count_1bit_diff); printf("total mistakes : %d\n", count_mistake); fclose(fp); return 0; }
int main(void) { FILE *fp; union data_32bit a, b, result, correct; uint32_t a_uint32, b_uint32; int count_mistake = 0; //誤答数をカウント int count_1bit_diff = 0; //1bitずれをカウント if ((fp = fopen("testcase.txt", "r")) == NULL) { printf("file open error.\n"); exit(EXIT_FAILURE); } while(fscanf(fp, "%x %x", &a_uint32, &b_uint32) != EOF) { a.uint32 = normalize(a_uint32); b.uint32 = normalize(b_uint32); //printf("a: %10u ", a.uint32); //printf("b: %10u\n", b.uint32); result.uint32 = fmul(a.uint32, b.uint32); correct.fl32 = a.fl32 * b.fl32; //printf("result : %10u\n", result.uint32); //printf("correct : %10u\n", correct.uint32); if (equal(result.uint32, correct.uint32) == 1) { } else if (equal(result.uint32, correct.uint32) == 2) { count_1bit_diff++; } else { //printf("0\n"); //一致しなければ0 count_mistake++; show_testcase(a, b, result, correct); } } printf("total 1bit_diff : %d\n", count_1bit_diff); printf("total mistakes : %d\n", count_mistake); fclose(fp); return 0; }
int main(void) { union data_32bit a, n, result, correct; uint32_t i; long unsigned int total_mistakes = 0; //誤答数をカウント /* long unsigned int count_no_diff = 0; long unsigned int count_1ulp_diff = 0; //1bitずれをカウント long unsigned int count_2ulp_diff = 0; long unsigned int count_3ulp_diff = 0; */ long unsigned int count_total_diff[PERMIT+1]; int count, j; for (i = 0; i < PERMIT+1; i++) { count_total_diff[i] = 0; } for (i = 0; i < 4294967295; i++) { if ((i % 100000000) == 0) { printf("> checked (%2u/42)\n", i / 100000000); } a.uint32 = i; n.uint32 = normalize(i); result.uint32 = finv(a.uint32); correct.fl32 = 1.0 / n.fl32; //非正規仮数を0に潰す count = count_diff(result.uint32, correct.uint32); if (count < PERMIT+1) { count_total_diff[count]++; } else { if (total_mistakes <= 5) { show_testcase(a, result, correct); } total_mistakes++; } /* switch (count_diff(result.uint32, correct.uint32)) { case 0: count_no_diff++; break; case 1: count_1ulp_diff++; break; case 2: count_2ulp_diff++; break; case 3: count_3ulp_diff++; break; default: total_mistakes++; if (total_mistakes <= 5) { show_testcase(a, result, correct); } if (total_mistakes == 5) { printf("more than 5 mistakes.\n"); } break; } */ } /* printf("total no diff : %lu\n", count_no_diff); printf("total 1ulp diff : %lu\n", count_1ulp_diff); printf("total 2ulp diff : %lu\n", count_2ulp_diff); printf("total 3ulp diff : %lu\n", count_3ulp_diff); printf("total mistakes : %lu (more than 3ulp)\n", total_mistakes); */ for (j = 0; j < PERMIT+1; j++) { printf("total %dulp diff : %lu\n", j, count_total_diff[j]); } printf("total mistakes : %lu\n", total_mistakes); return 0; }