我正在尝试解决第2版“C编程语言”中的练习2-1,其中要求:
“编写一个程序来确定char,short,int和long变量的范围,包括有符号和无符号,通过从标准头文件中打印适当的值并直接计算.如果你计算它们会更难:确定各种浮动的范围 – 点类型.“
我已经设法确定除浮点之外的所有类型的范围,通过使用标准头中的最小值和最大值以及直接计算.
如何使用直接计算确定浮点类型的范围?
#include <stdio.h> #include <limits.h> #include <float.h> #define TESTBIT 2 /* write a program to determine the ranges of char,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 */ main() { char ch,chtest; unsigned char uch; short sh,shtest; unsigned short ush; int i,itest; unsigned int ui; long l,ltest; unsigned long ul; long long ll,lltest; unsigned long long ull; ch = uch = sh = ush = i = ui = l = ul = ll = ull = 0; ++ch; /* Maximum and minimum ranges using direct computation */ chtest = 0; while (chtest >= 0) { chtest = ch * TESTBIT; if (chtest > 0) ch = ch * TESTBIT; } ch = ch * 2; printf("Minimum range of signed char variable: %d\n",ch); --ch; printf("Maximum range of signed char variable: %d\n",ch); --uch; printf("Maximum range of unsigned char variable: %u\n",uch); ++sh; shtest = 0; while (shtest >= 0) { shtest = sh * TESTBIT; if (shtest > 0) sh = sh * TESTBIT; } sh = sh * 2; printf("Minimum range of signed short variable: %d\n",sh); --sh; printf("Maximum range of signed short variable: %d\n",sh); --ush; printf("Maximum range of unsigned short variable: %u\n",ush); ++i; itest = 0; while (itest >= 0) { itest = i * TESTBIT; if (itest > 0) i = i * TESTBIT; } i = i * 2; printf("Minimum range of signed int variable: %d\n",i); --i; printf("Maximum range of signed int variable: %d\n",i); --ui; printf("Maximum range of unsigned int variable: %u\n",ui); ++l; ltest = 0; while (ltest >= 0) { ltest = l * TESTBIT; if (ltest > 0) l = l * TESTBIT; } l = l * 2; printf("Minimum range of signed long variable: %d\n",l); --l; printf("Maximum range of signed long variable: %d\n",l); --ul; printf("Maximum range of unsigned long variable: %lu\n",ul); ++ll; lltest = 0; while (lltest >= 0) { lltest = ll * TESTBIT; if (lltest > 0) ll = ll * TESTBIT; } ll = ll * 2; printf("Minimum range of signed long long variable: %lld\n",ll); --ll; printf("Maximum range of signed long long variable: %lld\n",ll); --ull; printf("Maximum range of unsigned long long variable: %llu\n",ull); printf("\nSize of char: %d\n",CHAR_BIT); /* Max and min ranges using limits.h and float.h header */ printf("Minimum range of signed char variable: %d\n",SCHAR_MIN); printf("Maximum range of signed char variable: %d\n",SCHAR_MAX); printf("Maximum range of unsigned char variable: %u\n",UCHAR_MAX); printf("Minimum range of signed short variable: %d\n",SHRT_MIN); printf("Maximum range of signed short variable: %d\n",SHRT_MAX); printf("Maximum range of unsigned short variable: %u\n",USHRT_MAX); printf("Minimum range of int variable: %d\n",INT_MIN); printf("Maximum range of int variable: %d\n",INT_MAX); printf("Maximum range of unsigned int variable: %u\n",UINT_MAX); printf("Minimum range of signed long variable: %ld\n",LONG_MIN); printf("Maximum range of signed long variable: %ld\n",LONG_MAX); printf("Maximum range of unsigned long variable: %lu\n",ULONG_MAX); printf("Minimum range of long long variable: %lld\n",LLONG_MIN); printf("Maximum range of long long variable: %lld\n",LLONG_MAX); printf("Maximum range of unsigned long long variable: %llu\n\n",ULONG_LONG_MAX); printf("Minimum range of float variable: %f\n",FLT_MIN); printf("Maximum range of float variable: %f\n",FLT_MAX); printf("Minimum range of double variable: %f\n",DBL_MIN); printf("Maximum range of double variable: %f\n",DBL_MAX); printf("Minimum range of long double variable: %lf\n",LDBL_MIN); printf("Maximum range of long double variable: %lf\n",LDBL_MAX); return 0; }
解决方法
#include <stdio.h> main() { float fl,fltest,last; double dbl,dbltest,dblast; fl = 0.0; fltest = 0.0; while (fl == 0.0) { last = fltest; fltest = fltest + 1111e28; fl = (fl + fltest) - fltest; } printf("Maximum range of float variable: %e\n",last); dbl = 0.0; dbltest = 0.0; while (dbl == 0.0) { dblast = dbltest; dbltest = dbltest + 1111e297; dbl = (dbl + dbltest) - dbltest; } printf("Maximum range of double variable: %e\n",dblast); return 0; }