/*------------------------------------------------------* | Author: Maurizio Loreti, aka MLO or (HAM) I3NOO | | Work: University of Padova - Department of Physics | | Via F. Marzolo, 8 - 35131 PADOVA - Italy | | Phone: +39 (049) 827-7216 FAX: +39 (049) 827-7102 | | EMail: loreti@pd.infn.it | | WWW: http://www.pd.infn.it/~loreti/mlo.html | *------------------------------------------------------* BInary Number Encoder; the main program asks for double values to be translated into a signed binary number. Exit with EOF. *------------------------------------------------------*/ #include #include #include #include #include #define BUFFER_LENGTH 128 void bine(double, char *); int main() { for (;;) { char inbuf[BUFFER_LENGTH]; char outbuf[BUFFER_LENGTH]; char *pc; double value; fputs("? ", stdout); if (fgets(inbuf, BUFFER_LENGTH, stdin) == 0) break; if ((pc = strrchr(inbuf, '\n')) != 0) *pc = '\0'; value = strtod(inbuf, &pc); if (*pc != '\0' && !isspace(*pc)) { printf("\"%s\": invalid input\n", inbuf); } else { bine(value, outbuf); printf("%f --> %s binary\n", value, outbuf); } } puts(""); return 0; } void bine( double value, char *out ) { /** | Translates "value" into a signed binary representation, up to a | maximum of DBL_MANT_DIG binary digits. **/ unsigned long integer_part; unsigned int digits = 0; if (value < 0) { value = -value; *out++ = '-'; } if ((integer_part = value) != 0) { char tempbuf[BUFFER_LENGTH]; char *pc; value -= integer_part; for (pc = tempbuf; integer_part; integer_part >>= 1) { if (integer_part & 1) *pc++ = '1'; else *pc++ = '0'; ++digits; } do { *out++ = *(--pc); } while (pc != tempbuf); } else { *out++ = '0'; } if (value != 0.0) { *out++ = '.'; while (digits < DBL_MANT_DIG && value != 0.0) { integer_part = (value *= 2.0); if (integer_part) { *out++ = '1'; value -= 1.0; } else { *out++ = '0'; } ++digits; } } *out = '\0'; }