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;
}
Beispiel #2
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;
}