-1

我不知道为什么这个程序不起作用。是C语言。在 Unix 中,它显示“未定义的日志引用” 谁能帮我找出错误并告诉我如何修复它?

下面的代码图片

或者:

#include <stdio.h>
#include <math.h>

int main()
{
  double x0, x1=4, x2=5, y0, sta=10, error = 0.00001, base = 2;
  do
  {
    x0 = (x1 + x2) / 2;
    y0 = (x0) * (log(x0))/(log(base));
    if ( y0 > sta )
    {
      x2 = x0;
    }else{
      x1 = x0;
    }
  }while(y0 > error);
  printf("%lf", x0);

  return 0;
}

当心转录错误!我希望没有。

4

1 回答 1

3

您必须链接到数学库。

  user@x:~/src$ 
  user@x:~/src$ gcc -Wall file_that_uses_math_library.c -o bin -lm

这应该可以解决您的问题。它没有找到 log() 函数,因为代码在编译时没有链接。


编辑: 您在对此答案的评论中提到“没有打印出来” 。那是因为您的代码错误并且包含错​​误。条件y0 > error永远不会满足,因此循环是无限的。如果您调用printf()并将其放在循环内,您将看到循环永远不会结束,并且会一遍又一遍地打印出相同的值。

如果您编译/运行此代码,您将看到 y0 的值始终为 10,并且永远不会小于 .000001

#include <stdio.h>
#include <math.h>

int main()
{
  double x0, x1=4, x2=5, y0, sta=10, error = 0.00001, base = 2;
  do
  {
    x0 = (x1 + x2) / 2;
    y0 = (x0) * (log(x0))/(log(base));
    if ( y0 > sta )
    {
      x2 = x0;
    }else{
      x1 = x0;
    }

  printf("%lf is not less than %f\n", y0, error);

  }while(y0 > error);
  return 0;
}

您可能会从学习如何使用 GNU 调试器中受益,因为通过在 main 上设置 abreakpoint,键入next一次命令并简单地按住 return,您会看到您的程序永远不会离开循环。我不会把它的输出放到这篇文章中,因为它会很长。

于 2013-10-29T03:49:33.200 回答