Ошибка 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);
Объяснение кода листинга программы
- Создается условие:
если beta больше 0, то
- Название переменной:
beta
- Значение переменной: не определено в данном контексте
- Название переменной:
- Если условие верно, то
- Рассчитывается значение переменной
x
как экспонента от логарифма отbeta
деленного на 3:x:=exp(ln(beta)/3)
- Рассчитывается значение переменной
- Если предыдущее условие не выполнено, но
beta равно 0, то
- Значение переменной
x
устанавливается равным 0:x:=0
- Значение переменной
- Если ни одно из предыдущих условий не выполнилось (т.е. beta меньше 0), то
- Рассчитывается значение переменной
x
как минус экспонента от логарифма от отрицательногоbeta
деленного на 3:x:=-exp(ln(-beta)/3)
- Рассчитывается значение переменной
- Независимо от условий рассчитывается значение переменной
alfa
как арктангенсx
:alfa:=arctan(x)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д