#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 */