我正在研究一个能够长期做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;
}
答案 0 :(得分:1)
我很好奇这个神奇的16点发生了什么。
double
具有53位尾数(通常,如果是IEEE754),对应于大约16个十进制数字。因此将数字表示为double
s会给出大约16个正确的十进制数字,超出它可能都是舍入误差。