【问题标题】:Errors about too few arguments关于参数太少的错误
【发布时间】:2013-11-21 06:15:43
【问题描述】:

下面在fpnewton 行的int main 部分返回的参数太少。 你能解释一下吗?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double f(double a, double b, double c, double x)
{
   return pow(x,3)+a*pow(x,2)+b*x+c;
}

double fp(double a, double b, double c, double x)
{
   return 3*pow(x,2)+(2*a*x)+b+0*c;
}

double newton(double a, double b, double c, double x)
{
   return x - (f(a,b,c,x)/fp(a,b,c,x));
}

int main()
{
   double a,b,c,x1,x2; 
   int i;
   char *input = getenv("QUERY_STRING");
   sscanf(input, "coeff1=%lf &coeff2=%lf &coeff3=%lf &x=%lf", &a, &b, &c, &x1);
   if (fp(x1)==0.0)
   {
      printf("No convergence.\n");
      return 0;
   }
   for (i=0;i<100;i++)
   {
      x2=newton(x1);
      if (fabs(x1-x2)<= pow(10,-10)) break;
      x1=x2;
   }
   printf("iteration = %d\n", i);
   printf("x= %lf\n", x1);
   return 0;
}

【问题讨论】:

  • @DavidPilkington 在我看来确实像 C。
  • 我觉得是 C...我在数值分析/编程课上,我们在 unix 中输入这些命令(基本系统命令)
  • @user3016224 你至少应该知道你在用什么语言编程。这些不是系统命令,而是C代码。

标签: c compiler-errors


【解决方案1】:

正是错误所说的!你没有传递足够的参数:

这个原型:

fp(double a, double b, double c, double x) {

表示您需要传递四个参数,例如:

fp(x1, what, about, these);

newton 也是如此。

另外,关于if (fp(x1)==0.0) - 虽然浮点零值可以相互比较(零是非常零),请记住计算机上的浮点是不准确。因此,您应该始终与某个 epsilon 值进行比较:

#define EPSILON           0.0001     // salt to taste
#define ABS(x)            ( ((x)<0) ? -(x) : x )
#define FP_EQUALS(x,y)    (ABS(x-y) < EPSILON)

//if (d == 0.0) {
if (FP_EQUALS(d, 0.0)) {
    // d is "zero"
}

//if (a == b) {
if (FP_EQUALS(a, b) {

【讨论】:

  • 非常感谢!我的搭档同时发现了这一点(我们已经盯着它看了一个多小时)。这个 epsilon 值是一个复杂的公式还是只是一个接近 0 的计算数字?
  • @user3016224 某个值接近于零。它与您的程序在计算中应允许的最大误差有关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2018-04-22
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多