变量限制

时间:2012-02-24 03:47:37

标签: c

我正在研究一个能够长期做POW的功能。它是处理函数调用和变量切换的赋值,而不是如何使用math.h。

该功能适用​​于规范所需,但我想添加(对于我自己的ACD问题)范围过滤器。

我必须使用给定的原型(double base,int exp) 我无法添加任何标题...仅限于stdio.h和stdlib.h。

我想做log base(max_VALUE)> exp检查指数和base不超过double可能持有的最大值。那很有效。

当我使用基数10测试功率计算并且任何超过22的指数时,我发生了什么事情,我会得到一些错误的结果。 10 ^ 50 我会得到 1,16 0s 1和剩余0 。如果我 10 ^ 23 我会 99999999999999992000000.00000

我很好奇这个神奇的16点发生了什么。作为一个静态值,为了让事情发挥作用,在那里折腾什么是一个很好的价值?理想情况下,我想使用size_of()并计算出最大值,但是现在我并不太关心它。

过滤完全是因为我需要让代码因输入验证不良而崩溃。

提前感谢您的帮助!

这是我对函数的所有......

double Power( double base, int exp )
{


    int i;
    double max_VALUE = 1;
    double power_sum = 1;
    //  calculation of system specific max variable value - I would have used limits.h but thought
    //  the idea of lab was to have restraints on us so I did it long-handed.

    for ( i=0; i<(sizeof(base)*8); i++ )
        {
            max_VALUE *= 2;
        }

    //   'Out of Range' filter

            while (max_VALUE > base)
            {
                max_VALUE = max_VALUE / base;   // max_VALUE is divided by base until it becomes less
                i++;                            // than base. 'i' is the highest exponent this system can handle
            }                                   // for the given base. ( Slight fudge factor because I'm rounding it off. )
            if ( abs(exp) > i )
            {
                printf("\n\n*** Out of RANGE Error ***\n\n");
                return  0;
            }



    //  Power Calculation

    for(i=0;i < abs(exp) ;i++)       // Loop equals exponent value
    {
        power_sum *= base;
    }

    power_sum = ( exp < 0) ? ( 1 / power_sum ) : power_sum;  //corrects for negative exponent

    return power_sum;
}

1 个答案:

答案 0 :(得分:1)

  

我很好奇这个神奇的16点发生了什么。

double具有53位尾数(通常,如果是IEEE754),对应于大约16个十进制数字。因此将数字表示为double s会给出大约16个正确的十进制数字,超出它可能都是舍入误差。