如何使用直接计算确定浮点类型的范围?

前端之家收集整理的这篇文章主要介绍了如何使用直接计算确定浮点类型的范围?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试解决第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;
}

猜你在找的C&C++相关文章