//    Подпрограмма func вычисления функции по ее внутреннему представлению,
//    построенному подпрограммой compil. Находится в calc.c
//
//    (c) Boland 1994

float func(float x[10])
{
  float a,b;
  int i;
  fcalls++;
  clearstack(); errorlevel=0;
  for(i=0;(!errorlevel)&&(pr[i]!=99);i++)
  {
    switch(pr[i])
    {
      case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
      case 9:   pushstack(x[pr[i]]); break;
      case 10:  pushstack(org[i]); break;
      case 11:  a=popstack(); b=popstack(); pushstack(a=a+b); break;
      case 12:  a=popstack(); b=popstack(); pushstack(a=b-a); break;
      case 13:  a=popstack(); b=popstack(); pushstack(a=b*a); break;
      case 14:  a=popstack(); b=popstack();
		if(a==0)
		    errorlevel=3;
		  else
		    pushstack(a=b/a);
		break;
      case 15:  a=popstack(); b=popstack();
		if((a==0)&&(b==0))
		    errorlevel=4;
		  else
		    pushstack(a=pow(b,a));
		break;
      case 16:  a=popstack();
		if(a<0)
		    errorlevel=5;
		  else
		    pushstack(a=sqrt(a));
		break;
      case 17:  a=popstack(); pushstack(a=abs(a)); break;
      case 18:  a=popstack(); pushstack(a=exp(a)); break;
      case 19:  a=popstack();
		if(a<=0)
		    errorlevel=6;
		  else
		    pushstack(a=log(a));
		break;
      case 20:  a=popstack(); pushstack(a=sin(a)); break;
      case 21:  a=popstack(); pushstack(a=cos(a)); break;
      case 22:  a=popstack(); pushstack(a=tan(a)); break;
      default:  break;
    }
  }
  if(!errorlevel)
      {
	a=popstack();
	return a;
      }
    else
      return 0;
}