diff options
author | zlg <zlg@zlg.space> | 2013-02-21 03:34:20 -0600 |
---|---|---|
committer | zlg <zlg@zlg.space> | 2013-02-21 03:34:20 -0600 |
commit | 43f5f3755d7fa66d9f525fe94fcc1517d3be55b9 (patch) | |
tree | 61bf9089849c9ebd3e4874c0b5cba1269512de10 | |
parent | Solve Exercise 2-01: Variable limits (diff) | |
download | knr-43f5f3755d7fa66d9f525fe94fcc1517d3be55b9.tar.gz knr-43f5f3755d7fa66d9f525fe94fcc1517d3be55b9.tar.bz2 knr-43f5f3755d7fa66d9f525fe94fcc1517d3be55b9.tar.xz knr-43f5f3755d7fa66d9f525fe94fcc1517d3be55b9.zip |
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.
-rw-r--r-- | ch2/2-01_limits.c | 18 |
1 files changed, 14 insertions, 4 deletions
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; } |