From 43f5f3755d7fa66d9f525fe94fcc1517d3be55b9 Mon Sep 17 00:00:00 2001 From: zlg Date: Thu, 21 Feb 2013 03:34:20 -0600 Subject: Correct 2-01 solution FLT_MIN and DBL_MIN refer to the lowest _positive number_ representable in floating-point form on the machine, not the lowest _negative number_. Subtracting FLT_MAX from 0 will give you the minimum. --- ch2/2-01_limits.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'ch2') diff --git a/ch2/2-01_limits.c b/ch2/2-01_limits.c index 666685b..05db050 100644 --- a/ch2/2-01_limits.c +++ b/ch2/2-01_limits.c @@ -128,15 +128,25 @@ int main() { db = (db + dba) - dba; } - printf("`float` maximum: %e\n", dbl); - printf("`float` minimum: -%e\n", dbl); + printf("`double` maximum: %e\n", dbl); + + db = 0.0; + dbl = 0.0; + dba = 0.0; + while (db == 0.0) { + dbl = dba; + dba = dba - 1111e297; + db = (db - dba) + dba; + } + + printf("`double` minimum: %e\n", dbl); printf("\nNow, let's cheat and use the helpful headers!\n"); printf("`char`s go from %d to %d (unsigned, up to %u)\n", SCHAR_MIN, SCHAR_MAX, UCHAR_MAX); printf("`short`s go from %d to %d (unsigned, up to %u)\n", SHRT_MIN, SHRT_MAX, USHRT_MAX); printf("`int`s go from %d to %d (unsigned, up to %u)\n", INT_MIN, INT_MAX, UINT_MAX); printf("`long`s go from %ld to %ld (unsigned, up to %lu)\n", LONG_MIN, LONG_MAX, ULONG_MAX); - printf("`float`s range from %e to %e\n", FLT_MIN, FLT_MAX); - printf("`double`s range from %e to %e\n", DBL_MIN, DBL_MAX); + printf("`float`s range from %e to %e\n", 0.0 - FLT_MAX, FLT_MAX); + printf("`double`s range from %e to %e\n", 0.0 - DBL_MAX, DBL_MAX); return 0; } -- cgit v1.2.3-54-g00ecf