aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzlg <zlg@zlg.space>2013-02-21 03:34:20 -0600
committerzlg <zlg@zlg.space>2013-02-21 03:34:20 -0600
commit43f5f3755d7fa66d9f525fe94fcc1517d3be55b9 (patch)
tree61bf9089849c9ebd3e4874c0b5cba1269512de10
parentSolve Exercise 2-01: Variable limits (diff)
downloadknr-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.c18
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;
}