[ create a new paste ] login | about

Link: http://codepad.org/H7N2A0k7    [ raw code | output | fork ]

C, pasted on May 15:
#include <stdio.h>

#define N 256

int isE(char c) {
  if (c == 'e' || c == 'E' || c == 'f' || c == 'F')
    return 1;
  else
    return 0;
}

int afp(double *significant, int *exponent, char buff[]) {
  int i, expsign, sigsign, fBody;
  double k;
  *significant = 0.0;
  *exponent = 0;
  sigsign = 0;
  i = 0;
  if (isE(buff[i])) {
    return 0;
  }
  /* sign */
  if (buff[i] == '+') {
    i++;
  }
  if (buff[i] == '-') {
    sigsign = 1;
    i++;
  }
  /* before point */
  fBody = 0;
  for (; buff[i] && buff[i] != '.'&& !isE(buff[i]) ; i++) {
    if (buff[i] >= '0' && buff[i] <= '9') {
      fBody = 1;
      *significant = *significant * 10.0;
      *significant = *significant + (buff[i] - '0');
    } else {
      return 0;
    }
  }
  /* after point */
  if (buff[i] == '.') {
    i++;
    k = 0.1;
    for (; buff[i] && !isE(buff[i]); i++) {
      if (buff[i] >= '0' && buff[i] <= '9') {
        fBody = 1;
        *significant = *significant + (k * (buff[i] - '0'));
        k = k / 10.0;
      } else {
        return 0;
      }
    }
  }
  /* *exponential part */
  if (isE(buff[i])) {
    i++;
    /* non-exponential indication : error */
    if (buff[i] == 0) {
      return 0;
    }
    expsign = 0;
    /* exponential sign */
    if (buff[i] == '+') {
      i++;
    } else if (buff[i] == '-') {
      expsign = 1;
      i++;
    }
    /* exponential indication */
    for (; buff[i]; i++) {
      if (buff[i] >= '0' && buff[i] <= '9') {
        *exponent = *exponent * 10;
        *exponent = *exponent + (buff[i] - '0');
      } else {
        return 0;
      }
    }
    if (expsign > 0)
      *exponent = *exponent * -1;
  }
  if (fBody == 0)
    return 0;
  if (sigsign > 0)
    *significant = *significant * -1.0;
  return 1;
}

double makeDouble(double significant, int exponent) {
  int i;
  double floatingNumber;
  floatingNumber = significant;
  if (exponent > 0) {
    for (i = 0; i < exponent; i++)
      floatingNumber *= 10.0;
  } else if (exponent < 0) {
    for (i = 0; i > exponent; --i)
      floatingNumber /= 10.0;
  }
  return floatingNumber;
}

int main() {
  static char buff[N];
  double significant, floatingNumber;
  int exponent;
#if 0
#include <string.h>
  int i;
  char *table[] = {
    "1",
    "-1",
    "-100",
    "+10",
    "1.e",
    "-1.E",
    ".1",
    "1.0",
    "1.-10",
    "-1.f1",
    "-1.F+1",
    "-1.e.1",
    "-10E10",
    "-1.f2",
    "1.0.",
    "-",
    "+",
    ".",
    "1.0 F",
    "e1",
    "E-1",
    "     3.4   ",
    "3.4 3.4",
  };
  for (i = 0; i < sizeof(table) / sizeof(char *); i++) {
    strcpy(buff, table[i]);
    printf("%d:", afp(&significant, &exponent, buff));
    printf("%s:%f\n", buff, makeDouble(significant, exponent));
  }
  return 0;
#else
  printf("floating-point: ");
  scanf("%s", buff);
  /* analyse floating-point expressio */
  /* Good: rc = 1, Bad: rc = 0 */
  if (afp(&significant, &exponent, buff)) {
    /* make double */
    floatingNumber = makeDouble(significant, exponent);
    /* plus one */
    floatingNumber = floatingNumber + 1.0;
    printf("Floating Number: %f\n", floatingNumber);
  } else {
    printf("Bad format.\n");
  }
  return 0;
#endif
}
/* end */


Output:
1
floating-point: Bad format.


Create a new paste based on this one


Comments: