【发布时间】:2015-11-23 20:51:22
【问题描述】:
我的代码有一个逻辑问题,可能是溢出引起的,但我自己无法解决,所以如果有人能帮助我,我将不胜感激。
在下面的代码中,我实现了函数 taylor_log(),它可以计算泰勒多项式的“n”次迭代。在 void 函数中,我正在寻找迭代次数(*limit),与来自的 log 函数相比,它足以计算具有所需精度的对数。
问题是有时 UINT_MAX 的迭代次数不足以获得所需的精度,此时我想让用户知道所需的迭代次数高于 UINT_MAX。但是我的代码不起作用,例如 x = 1e+280, eps = 623。它只是计数,计数,从不给出结果。
double taylor_log(double x, unsigned int n){
double f_sum = 1.0;
double sum = 0.0;
for (unsigned int i = 1; i <= n; i++)
{
f_sum *= (x - 1) / x;
sum += f_sum / i;
}
return sum;
}
void guessIt(double x, double eps, unsigned int *limit){
*limit = 10;
double real_log = log(x);
double t_log = taylor_log(x, *limit);
while(myabs(real_log - t_log) > eps)
{
if (*limit == UINT_MAX)
{
*limit = 0;
break;
}
if (*limit >= UINT_MAX/2)
{
*limit = UINT_MAX;
t_log = taylor_log(x, *limit);
}
else
{
*limit = (*limit) *2;
t_log = taylor_log(x, *limit);
}
}
}
编辑:好的,谢谢你们到目前为止的反应。我已将代码更改为:
if (*limit == UINT_MAX-1)
{
*limit = 0;
break;
}
if (*limit >= UINT_MAX/2)
{
*limit = UINT_MAX-1;
t_log = taylor_log(x, *limit);
}
但它仍然无法正常工作,我已将 printf 设置为 taylor_log() 函数的开头,以查看“n”的值及其 (..., 671088640, 1342177280, 2684354560, 5, 4, 3 , 2, 2, 1, 2013265920, ...)。没看懂。。
【问题讨论】:
-
这是在
C还是C++中? (看起来像C)。至于你的问题——为什么不在进入循环之前做一些边界检查?您可以对可接受的输入进行严格限制,并确保不会发生此问题。如果您想支持任意大的输入,请考虑使用libgmp或其他支持此类计算的数学库。 -
选择一种语言。
C或C++,没有C/C++这样的东西 -
"我已经实现了函数 taylor_log()" --> 这样做不正确,所以添加更多术语不会解决问题。
-
我已经在我实现的公式中包含了图像,我认为它是正确的。
-
我同意您可能已经根据
log()函数的图像进行了编码。我建议的下面的代码使用不同的系列。我需要看看你的系列是有效的还是不同的。
标签: c algorithm loops unsigned