/* EXERCISE 2-1 */ /* INTEGERS: */ /* FIRST, FIND THE GREATEST POWER OF 2 (2MAX) THAT WILL NOT CAUSE */ /* OVERFLOW BY MULTIPLICATION. THIS WILL NOT WORK WITH POWERS OF */ /* 10 FOR UNSIGNED NUMBERS IN WHICH THE FIRST BIT IS NOT USED AS A */ /* SIGN BIT. AFTER THE MAXIMUM POWER OF 10 IS LOADED, ANOTHER */ /* MULTIPLICATION MAY RESULT IN A LARGER OR SMALLER NUMBER. */ /* THE MAX POSITIVE VALUE = 2MAX + (2MAX - 1). */ /* THE MAX NEGATIVE VALUE CONTAINS '1' IN THE SIGN BIT AND '0' IN */ /* ALL FOLLOWING. */ /* FLOATING POINT: */ /* FIND THE MAX POSITIVE VALUE */ /* FIRST, FIND THE GREATEST POWER OF 2 THAT WILL FIT IN THE */ /* MANTISSA WITHOUT TRUNCATION. THEN, LOAD ALL '1' BITS TO THE */ /* MANTISSA. THEN, MULTIPLY THE FLOAT BY 2 TO INCREMENT THE */ /* EXPONENT UNTIL THE RESULT IS NOT A PROPER NUMBER. THIS OCCURS */ /* WHEN A DIVISION BY 2 DOES NOT RESTORE THE EXPONENT TO ITS */ /* FORMER VALUE. */ /* FIND THE MIN POSITIVE VALUE */ /* DIVIDE 1 BY 2 UNTIL THE RESULT IS NOT A PROPER NUMBER. THIS */ /* OCCURS WHEN A MULTIPLICATION BY 2 DOES NOT RESTORE THE EXPONENT */ /* TO ITS FORMER VALUE. */ #include <stdio.h> #include <limits.h> #include <float.h> main() { signed long int incr, uns_incr; signed char s_char_a, s_char_b; unsigned char u_char_a, u_char_b; signed short int s_short_int_a, s_short_int_b; unsigned short int u_short_int_a, u_short_int_b; signed int s_int_a, s_int_b; unsigned int u_int_a, u_int_b; signed long int s_long_int_a, s_long_int_b; unsigned long int u_long_int_a, u_long_int_b; float flt_a, flt_b, flt_c, flt_m; double dbl_a, dbl_b, dbl_c, dbl_m; /* SIGNED CHAR */ printf("\nSIGNED CHAR MAX\n"); printf("<limits.h> %d ", SCHAR_MAX); s_char_a = s_char_b = 1; while (s_char_a > 0) { s_char_a = s_char_a * 2; if (s_char_a > 0) s_char_b = s_char_a; } s_char_b = s_char_b + (s_char_b - 1); printf("COMPUTED %d\n", s_char_b); printf("\nSIGNED CHAR MIN\n"); printf("<limits.h> %d ", SCHAR_MIN); s_char_a = s_char_b = -1; while (s_char_a < 0) { s_char_a = s_char_a * 2; if (s_char_a < 0) s_char_b = s_char_a; } printf("COMPUTED %d\n", s_char_b); /* UNSIGNED CHAR */ printf("\nUNSIGNED CHAR MAX\n"); printf("<limits.h> %d ", UCHAR_MAX); u_char_a = u_char_b = 1; while (u_char_a > 0) { u_char_a = u_char_a * 2; if (u_char_a > 0) u_char_b = u_char_a; } u_char_b = u_char_b + (u_char_b - 1); printf("COMPUTED %d\n", u_char_b); /* SIGNED SHORT INT */ printf("\nSIGNED SHORT INT MAX\n"); printf("<limits.h> %hd ", SHRT_MAX); s_short_int_a = s_short_int_b = 1; while (s_short_int_a > 0) { s_short_int_a = s_short_int_a * 2; if (s_short_int_a > 0) s_short_int_b = s_short_int_a; } s_short_int_b = s_short_int_b + (s_short_int_b - 1); printf("COMPUTED %hd\n", s_short_int_b); printf("\nSIGNED SHORT INT MIN\n"); s_short_int_a = s_short_int_b = -1; while (s_short_int_a < 0) { s_short_int_a = s_short_int_a * 2; if (s_short_int_a < 0) s_short_int_b = s_short_int_a; } printf("<limits.h> %hd ", SHRT_MIN); printf("COMPUTED %hd\n", s_short_int_b); /* UNSIGNED SHORT INT */ printf("\nUNSIGNED SHORT INT MAX\n"); printf("<limits.h> %hu ", USHRT_MAX); u_short_int_a = u_short_int_b = 1; while (u_short_int_a > 0) { u_short_int_a = u_short_int_a * 2; if (u_short_int_a > 0) u_short_int_b = u_short_int_a; } u_short_int_b = u_short_int_b + (u_short_int_b - 1); printf("COMPUTED %hu\n", u_short_int_b); /* SIGNED INT */ printf("\nSIGNED INT MAX\n"); printf("<limits.h> %d ", INT_MAX); s_int_a = s_int_b = 1; while (s_int_a > 0) { s_int_a = s_int_a * 2; if (s_int_a > 0) s_int_b = s_int_a; } s_int_b = s_int_b + (s_int_b - 1); printf("COMPUTED %d\n", s_int_b); printf("\nSIGNED INT MIN\n"); s_int_a = s_int_b = -1; while (s_int_a < 0) { s_int_a = s_int_a * 2; if (s_int_a < 0) s_int_b = s_int_a; } printf("<limits.h> %d ", INT_MIN); printf("COMPUTED %d\n", s_int_b); /* UNSIGNED INT */ printf("\nUNSIGNED INT MAX\n"); printf("<limits.h> %u ", UINT_MAX); u_int_a = u_int_b = 1; while (u_int_a > 0) { u_int_a = u_int_a * 2; if (u_int_a > 0) u_int_b = u_int_a; } u_int_b = u_int_b + (u_int_b - 1); printf("COMPUTED %u\n", u_int_b); /* SIGNED LONG INT */ printf("\nSIGNED LONG INT MAX\n"); printf("<limits.h> %ld ", LONG_MAX); s_long_int_a = s_long_int_b = 1; while (s_long_int_a > 0) { s_long_int_a = s_long_int_a * 2; if (s_long_int_a > 0) s_long_int_b = s_long_int_a; } s_long_int_b = s_long_int_b + (s_long_int_b - 1); printf("COMPUTED %ld\n", s_long_int_b); printf("\nSIGNED LONG INT MIN\n"); s_long_int_a = s_long_int_b = -1; while (s_long_int_a < 0) { s_long_int_a = s_long_int_a * 2; if (s_long_int_a < 0) s_long_int_b = s_long_int_a; } printf("<limits.h> %ld ", LONG_MIN); printf("COMPUTED %ld\n", s_long_int_b); /* UNSIGNED LONG INT */ printf("\nUNSIGNED LONG INT MAX\n"); printf("<limits.h> %lu ", ULONG_MAX); u_long_int_a = u_long_int_b = 1; while (u_long_int_a > 0) { u_long_int_a = u_long_int_a * 2; if (u_long_int_a > 0) u_long_int_b = u_long_int_a; } u_long_int_b = u_long_int_b + (u_long_int_b - 1); printf("COMPUTED %lu\n", u_long_int_b); /* FLOAT */ printf("\nFLOAT MAX\n"); printf("<limits.h> %E ", FLT_MAX); flt_a = 2.0; flt_b = 1.0; while (flt_a != flt_b) { flt_m = flt_b; /* MAX POWER OF 2 IN MANTISSA */ flt_a = flt_b = flt_b * 2.0; flt_a = flt_a + 1.0; } flt_m = flt_m + (flt_m - 1); /* MAX VALUE OF MANTISSA */ flt_a = flt_b = flt_c = flt_m; while (flt_b == flt_c) { flt_c = flt_a; flt_a = flt_a * 2.0; flt_b = flt_a / 2.0; } printf("COMPUTED %E\n", flt_c); printf("\nFLOAT MIN\n"); printf("<limits.h> %E ", FLT_MIN); flt_a = flt_b = flt_c = 1.0; while (flt_b == flt_c) { flt_c = flt_a; flt_a = flt_a / 2.0; flt_b = flt_a * 2.0; } printf("COMPUTED %E\n", flt_c); /* DOUBLE */ printf("\nDOUBLE MAX\n"); printf("<limits.h> %E ", DBL_MAX); dbl_a = 2.0; dbl_b = 1.0; while (dbl_a != dbl_b) { dbl_m = dbl_b; /* MAX POWER OF 2 IN MANTISSA */ dbl_a = dbl_b = dbl_b * 2.0; dbl_a = dbl_a + 1.0; } dbl_m = dbl_m + (dbl_m - 1); /* MAX VALUE OF MANTISSA */ dbl_a = dbl_b = dbl_c = dbl_m; while (dbl_b == dbl_c) { dbl_c = dbl_a; dbl_a = dbl_a * 2.0; dbl_b = dbl_a / 2.0; } printf("COMPUTED %E\n", dbl_c); printf("\nDOUBLE MIN\n"); printf("<limits.h> %E ", DBL_MIN); dbl_a = dbl_b = dbl_c = 1.0; while (dbl_b == dbl_c) { dbl_c = dbl_a; dbl_a = dbl_a / 2.0; dbl_b = dbl_a * 2.0; } printf("COMPUTED %E\n", dbl_c); }