Exercise 2-1 (sizes - Numeric type limits)
Chapter_2 | intlimits Exercise_2-2 |
Exercise 2-1 K&R, p. 36-37
Exercise 2-1. Write a program to determine the ranges of char, short, int, and long variables, both signed and unsigned, by printing appropriate values from standard headers and by direct computation. Harder if you compute them: determine the ranges of the various floating-point types.
sizes.c download
#include <stdio.h> // for printf()
#include <limits.h>
#include <float.h>
int main()
{
printf("CHAR_BIT: %d\n", CHAR_BIT);
printf("signed char: [%d, %d]\n", SCHAR_MIN, SCHAR_MAX);
printf("char: [%d, %d]\n", CHAR_MIN, CHAR_MAX);
printf("unsigned char: [0, %d]\n", UCHAR_MAX);
printf("short: [%d, %d]\n", SHRT_MIN, SHRT_MAX);
printf("unsigned short: [0, %d]\n", USHRT_MAX);
printf("int: [%d, %d]\n", INT_MIN, INT_MAX);
printf("unsigned int: [0, %u]\n", UINT_MAX);
printf("long int: [%ld, %ld]\n", LONG_MIN, LONG_MAX);
printf("unsigned long: [0, %lu]\n", ULONG_MAX);
printf("long long int: [%lld, %lld]\n", LLONG_MIN, LLONG_MAX);
printf("unsigned long long: [0, %llu]\n", ULLONG_MAX);
printf("FLT_DIG: %d, DBL_DIG: %d, LDBL_DIG: %d\n", FLT_DIG, DBL_DIG, LDBL_DIG);
printf("FLT_DECIMAL_DIG: %d, DBL_DECIMAL_DIG: %d, LDBL_DECIMAL_DIG: %d\n",
FLT_DECIMAL_DIG, DBL_DECIMAL_DIG, LDBL_DECIMAL_DIG);
printf("DECIMAL_DIG: %d\n", DECIMAL_DIG);
printf("FLT_MIN_10_EXP: %d, DBL_MIN_10_EXP: %d, LDBL_MIN_10_EXP: %d\n",
FLT_MIN_10_EXP, DBL_MIN_10_EXP, LDBL_MIN_10_EXP);
printf("FLT_MAX_10_EXP: %d, DBL_MAX_10_EXP: %d, LDBL_MAX_10_EXP: %d\n",
FLT_MAX_10_EXP, DBL_MAX_10_EXP, LDBL_MAX_10_EXP);
printf("FLT_MIN_EXP: %d, DBL_MIN_EXP: %d, LDBL_MIN_EXP: %d\n",
FLT_MIN_EXP, DBL_MIN_EXP, LDBL_MIN_EXP);
printf("FLT_MAX_EXP: %d, DBL_MAX_EXP: %d, LDBL_MAX_EXP: %d\n",
FLT_MAX_EXP, DBL_MAX_EXP, LDBL_MAX_EXP);
printf("FLT_EPSILON: %g, DBL_EPSILON: %g, LDBL_EPSILON: %Lg\n",
FLT_EPSILON, DBL_EPSILON, LDBL_EPSILON);
printf("FLT_TRUE_MIN: %g, DBL_TRUE_MIN: %g, LDBL_TRUE_MIN: %Lg\n",
FLT_TRUE_MIN, DBL_TRUE_MIN, LDBL_TRUE_MIN);
printf("FLT_RADIX (Radix of exponent representation): %d\n", FLT_RADIX);
printf("float: %d mantissa digits\t", FLT_MANT_DIG);
printf("[%g, %g]\n", FLT_MIN, FLT_MAX);
printf("double: %d mantissa digits\t", DBL_MANT_DIG);
printf("[%g, %g]\n", DBL_MIN, DBL_MAX);
printf("long double: %d mantissa digits\t", LDBL_MANT_DIG);
printf("[%Lg, %Lg]\n", LDBL_MIN, LDBL_MAX);
return 0;
}
/*
gcc -E sizes.c // preprocess to show the contents of header files
// On disk: /usr/include/limits.h, /usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h,
// /usr/lib/gcc/x86_64-linux-gnu/9/include/float.h
gcc sizes.c -o sizes
./sizes
CHAR_BIT: 8
signed char: [-128, 127]
char: [-128, 127]
unsigned char: [0, 255]
short: [-32768, 32767]
unsigned short: [0, 65535]
int: [-2147483648, 2147483647]
unsigned int: [0, 4294967295]
long int: [-9223372036854775808, 9223372036854775807]
unsigned long: [0, 18446744073709551615]
long long int: [-9223372036854775808, 9223372036854775807]
unsigned long long: [0, 18446744073709551615]
FLT_DIG: 6, DBL_DIG: 15, LDBL_DIG: 18
FLT_DECIMAL_DIG: 9, DBL_DECIMAL_DIG: 17, LDBL_DECIMAL_DIG: 21
DECIMAL_DIG: 21
FLT_MIN_10_EXP: -37, DBL_MIN_10_EXP: -307, LDBL_MIN_10_EXP: -4931
FLT_MAX_10_EXP: 38, DBL_MAX_10_EXP: 308, LDBL_MAX_10_EXP: 4932
FLT_MIN_EXP: -125, DBL_MIN_EXP: -1021, LDBL_MIN_EXP: -16381
FLT_MAX_EXP: 128, DBL_MAX_EXP: 1024, LDBL_MAX_EXP: 16384
FLT_EPSILON: 1.19209e-07, DBL_EPSILON: 2.22045e-16, LDBL_EPSILON: 1.0842e-19
FLT_TRUE_MIN: 1.4013e-45, DBL_TRUE_MIN: 4.94066e-324, LDBL_TRUE_MIN: 3.6452e-4951
FLT_RADIX (Radix of exponent representation): 2 // base 2 (binary)
float: 24 mantissa digits [1.17549e-38, 3.40282e+38]
double: 53 mantissa digits [2.22507e-308, 1.79769e+308]
long double: 64 mantissa digits [3.3621e-4932, 1.18973e+4932]
*/
Note: See Exercise_2-1 on clc-wiki-kr for computed solutions. See also intlimits, sizeof, and computed.
Chapter_2 | BACK_TO_TOP | intlimits Exercise_2-2 |
Comments
Post a Comment