Ошибка External: SIGFPE - Pascal

Узнай цену своей работы

Формулировка задачи:

Выскакивает ошибка External: SIGFPE на 35 строке. alfa:=arctan(exp(1/3*ln(beta))); Подскажите, пожалуйста, в чем может быть проблема. Проблем с операциями нет (корни из отрицательного числа и проч.). Пробовал изменять типы данных — безрезультатно.
program katinaradost;
uses math;
var z, pk, tk, w, ps,k,fi,ac,bc,acc,alfaT,x,y,fl,fv: array [1..3] of real;
  pp,t,r,am,bm,fipr,fil,fiv,summa,a,b,cc,m,psi,v,zl,zv: real;
  cb: array [1..3,1..3] of real;
  i,j: integer;
procedure kardano(a,b,cc,usl:real; var yy:real);
var alfa,beta,p,q,qb: real; y: array [1..3] of real;
begin
 p:=-a*a/3+b;
 q:=2*(a/3)*(a/3)*(a/3)-a*b/3+cc;
 qb:=(p/3)*(p/3)*(p/3)+(q/2)*(q/2);
 
 if (qb<0) and (p<0) then
  begin
 
   alfa:=arccos(-q/(2*sqrt((-p/3)*(-p/3)*(-p/3))));
   y[1]:=2*sqrt(-p/3)*cos(alfa/3);
   y[2]:=-2*sqrt(-p/3)*cos(alfa/3+3.14/3);
   y[3]:=-2*sqrt(-p/3)*cos(alfa/3-3.14/3);
   if usl=1 then {наибольшее}
    begin
     if y[1]>y[2] then yy:=y[1] else yy:=y[2];
     if yy<y[3] then yy:=y[3];
    end;
   if usl=2 then {наименьшее}
    begin
     if y[1]>y[2] then yy:=y[2] else yy:=y[1];
     if yy>y[3] then yy:=y[3];
    end;
   end;
  if (qb>=0) and (p>0) then
   begin
    beta:=(2/q*sqrt((p/3)*(p/3)*(p/3)));
    alfa:=arctan(exp(1/3*ln(beta)));
    yy:=-2*sqrt(p/3)*cos(2*alfa)/sin(2*alfa);
   end;
  if (qb>=0) and (p<0) then
   begin
   beta:=arcsin(2/q*sqrt((-p/3)*(-p/3)*(-p/3)));
   alfa:=arctan(exp(1/3*ln(sin(beta)/cos(beta))));
   yy:=-2*sqrt(-p/3)*1/sin(2*alfa);
   end;
end;
 
begin
  pk[1]:= 54.4*1e5;  {метан}
  tk[1]:= 190.6;
  w[1]:= 0.008;
  z[1]:= 0.6;
  pk[2]:= 48.2*1e5; {этан}
  tk[2]:= 305.4;
  w[2]:= 0.098;
  z[2]:= 0.15;
  pk[3]:= 37.5*1e5;  {бутан}
  tk[3]:= 425.2;
  w[3]:= 0.193;
  z[3]:= 0.25;
  pp:=2*1e7;
  t:=343;
  r:=8.31;
 
  cb[2,1]:=1;
  cb[1,2]:=cb[2,1];
  cb[1,3]:=3.1;
  cb[3,1]:= cb[1,3];
  cb[2,3]:=0.45;
  cb[3,2]:=cb[2,3];
  cb[1,1]:=0;
  cb[2,2]:=0;
  cb[3,3]:=0;

  for i:=1 to 3 do
   begin
    ps[i]:=exp(5.373*(1+w[i])*(1-tk[i]/t))*pk[i];
    k[i]:=ps[i]/pp;
   end;
 
  repeat
  a:=(k[2]*k[3]*z[1]+k[1]*k[3]*z[2]+k[1]*k[2]*z[3]-k[2]*z[1]-k[3]*z[2]-k[1]*z[3]-k[3]*z[1]-k[1]*z[2]-k[2]*z[3]+z[1]+z[2]+z[3]-k[1]*k[2]-k[1]*k[3]-k[2]*k[3]+2*(k[1]+k[2]+k[3]-1))/(-k[1]*k[2]*k[3]+k[1]*k[2]+k[1]*k[3]+k[2]*k[3]-k[1]-k[2]-k[3]+1);
  b:=(k[3]*z[1]+k[1]*z[2]+k[2]*z[3]+k[2]*z[1]+k[3]*z[2]+k[1]*z[3]-2*(z[1]+z[2]+z[3]-1)-k[1]-k[2]-k[3])/(-k[1]*k[2]*k[3]+k[1]*k[2]+k[1]*k[3]+k[2]*k[3]-k[1]-k[2]-k[3]+1);
  cc:=(z[1]+z[2]+z[3]-1)/(-k[1]*k[2]*k[3]+k[1]*k[2]+k[1]*k[3]+k[2]*k[3]-k[1]-k[2]-k[3]+1);
 
  kardano(a,b,cc,0,v); {мольная доля пар. фазы V}
 
  for i:=1 to 3 do
   begin
    x[i]:=z[i]/(1-v+k[i]*v);
    y[i]:=z[i]/(1-v+k[i]*v)*k[i];
   end;
 
  for i:=1 to 3 do
   begin
    acc[i]:=0.46*r*r*tk[i]*tk[i]/pk[i];
    if w[i]<0.49 then m:=0.37+1.54*w[i]-0.27*w[i]*w[i] else m:=0.38+1.41*w[i]-0.16*w[i]*w[i]+0.017*w[i]*w[i]*w[i];
    alfaT[i]:=(1+m*(1-sqrt(t/tk[i])))*(1+m*(1-sqrt(t/tk[i])));
    ac[i]:=acc[i]*alfaT[i];
    bc[i]:=0.078*r*tk[i]/pk[i];
   end;

  for i:=1 to 3 do
   for j:=1 to 3 do
    begin
     am:=am+(1-cb[i,j])*x[i]*x[j]*sqrt(ac[i]*ac[j]);
    end;
  for i:=1 to 3 do
   begin
    bm:=bm+x[i]*bc[i];
   end;
 
  a:=bm-r*t/pp;
  b:=(r*t*(am-2*b))/pp-3*bm*bm;
  cc:=bm*bm*bm+r*t*(bm*bm-am*bm)/pp;
 
  kardano(a,b,cc,2,zl); {коэф. сферхсжим жля жидк. фазы, из ур. PR}
 
  for i:=1 to 3 do
   for j:=1 to 3 do
    begin
     am:=am+(1-cb[i,j])*y[i]*y[j]*sqrt(ac[i]*ac[j]);
    end;
  for i:=1 to 3 do
   begin
    bm:=bm+y[i]*bc[i];
   end;

  a:=bm-r*t/pp;
  b:=(r*t*(am-2*b))/pp-3*bm*bm;
  cc:=bm*bm*bm+r*t*(bm*bm-am*bm)/pp;
 
  kardano(a,b,cc,1,zv); {коэф. сферхсжим жля пар. фазы, из ур. PR}

  for i:=1 to 3 do
   begin
  psi:=0.37+1.57*w[i]-0.27*sqr(w[i]);
  fipr:=sqr(1+psi*(1-sqrt(t/tk[i])));
  fil:=exp(zl-1-ln(zl-0.078*(pp/pk[i])/(t/tk[i]))-2.078*fipr/(t/tk[i])*ln((zl+0.19*(pp/pk[i])/(t/tk[i]))/(zl-0.032*(pp/pk[i])/(t/tk[i]))));
  fiv:=exp(zv-1-ln(zv-0.078*(pp/pk[i])/(t/tk[i]))-2.078*fipr/(t/tk[i])*ln((zv+0.19*(pp/pk[i])/(t/tk[i]))/(zv-0.032*(pp/pk[i])/(t/tk[i]))));
  fl[i]:=fil*pp*z[i];
  fv[i]:=fiv*pp*z[i];
   end;

  summa:=0;
 
  for i:=1 to 3 do
   begin
  k[i]:=fl[i]/fv[i];
  summa:=summa+(1-k[i])*(1-k[i]);
   end;
 
  until summa<1e-8;
 
  writeln(x[1],x[2],x[3]);
  writeln(y[1],y[2],y[3]);

end.

Решение задачи: «Ошибка External: SIGFPE»

textual
Листинг программы
if beta>0 then x:=exp(ln(beta)/3)
else if beta=0 then x:=0
else x:=-exp(ln(-beta)/3);
alfa:=arctan(x);

Объяснение кода листинга программы

  1. Создается условие: если beta больше 0, то
    • Название переменной: beta
    • Значение переменной: не определено в данном контексте
  2. Если условие верно, то
    • Рассчитывается значение переменной x как экспонента от логарифма от beta деленного на 3: x:=exp(ln(beta)/3)
  3. Если предыдущее условие не выполнено, но beta равно 0, то
    • Значение переменной x устанавливается равным 0: x:=0
  4. Если ни одно из предыдущих условий не выполнилось (т.е. beta меньше 0), то
    • Рассчитывается значение переменной x как минус экспонента от логарифма от отрицательного beta деленного на 3: x:=-exp(ln(-beta)/3)
  5. Независимо от условий рассчитывается значение переменной alfa как арктангенс x: alfa:=arctan(x)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.25 из 5