Ошибка External: SIGFPE - Pascal

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

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

Выскакивает ошибка External: SIGFPE на 35 строке. alfa:=arctan(exp(1/3*ln(beta))); Подскажите, пожалуйста, в чем может быть проблема. Проблем с операциями нет (корни из отрицательного числа и проч.). Пробовал изменять типы данных — безрезультатно.
Листинг программы
  1. program katinaradost;
  2. uses math;
  3. var z, pk, tk, w, ps,k,fi,ac,bc,acc,alfaT,x,y,fl,fv: array [1..3] of real;
  4. pp,t,r,am,bm,fipr,fil,fiv,summa,a,b,cc,m,psi,v,zl,zv: real;
  5. cb: array [1..3,1..3] of real;
  6. i,j: integer;
  7. procedure kardano(a,b,cc,usl:real; var yy:real);
  8. var alfa,beta,p,q,qb: real; y: array [1..3] of real;
  9. begin
  10. p:=-a*a/3+b;
  11. q:=2*(a/3)*(a/3)*(a/3)-a*b/3+cc;
  12. qb:=(p/3)*(p/3)*(p/3)+(q/2)*(q/2);
  13. if (qb<0) and (p<0) then
  14. begin
  15. alfa:=arccos(-q/(2*sqrt((-p/3)*(-p/3)*(-p/3))));
  16. y[1]:=2*sqrt(-p/3)*cos(alfa/3);
  17. y[2]:=-2*sqrt(-p/3)*cos(alfa/3+3.14/3);
  18. y[3]:=-2*sqrt(-p/3)*cos(alfa/3-3.14/3);
  19. if usl=1 then {наибольшее}
  20. begin
  21. if y[1]>y[2] then yy:=y[1] else yy:=y[2];
  22. if yy<y[3] then yy:=y[3];
  23. end;
  24. if usl=2 then {наименьшее}
  25. begin
  26. if y[1]>y[2] then yy:=y[2] else yy:=y[1];
  27. if yy>y[3] then yy:=y[3];
  28. end;
  29. end;
  30. if (qb>=0) and (p>0) then
  31. begin
  32. beta:=(2/q*sqrt((p/3)*(p/3)*(p/3)));
  33. alfa:=arctan(exp(1/3*ln(beta)));
  34. yy:=-2*sqrt(p/3)*cos(2*alfa)/sin(2*alfa);
  35. end;
  36. if (qb>=0) and (p<0) then
  37. begin
  38. beta:=arcsin(2/q*sqrt((-p/3)*(-p/3)*(-p/3)));
  39. alfa:=arctan(exp(1/3*ln(sin(beta)/cos(beta))));
  40. yy:=-2*sqrt(-p/3)*1/sin(2*alfa);
  41. end;
  42. end;
  43. begin
  44. pk[1]:= 54.4*1e5; {метан}
  45. tk[1]:= 190.6;
  46. w[1]:= 0.008;
  47. z[1]:= 0.6;
  48. pk[2]:= 48.2*1e5; {этан}
  49. tk[2]:= 305.4;
  50. w[2]:= 0.098;
  51. z[2]:= 0.15;
  52. pk[3]:= 37.5*1e5; {бутан}
  53. tk[3]:= 425.2;
  54. w[3]:= 0.193;
  55. z[3]:= 0.25;
  56. pp:=2*1e7;
  57. t:=343;
  58. r:=8.31;
  59. cb[2,1]:=1;
  60. cb[1,2]:=cb[2,1];
  61. cb[1,3]:=3.1;
  62. cb[3,1]:= cb[1,3];
  63. cb[2,3]:=0.45;
  64. cb[3,2]:=cb[2,3];
  65. cb[1,1]:=0;
  66. cb[2,2]:=0;
  67. cb[3,3]:=0;
  68.  
  69. for i:=1 to 3 do
  70. begin
  71. ps[i]:=exp(5.373*(1+w[i])*(1-tk[i]/t))*pk[i];
  72. k[i]:=ps[i]/pp;
  73. end;
  74. repeat
  75. 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);
  76. 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);
  77. 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);
  78. kardano(a,b,cc,0,v); {мольная доля пар. фазы V}
  79. for i:=1 to 3 do
  80. begin
  81. x[i]:=z[i]/(1-v+k[i]*v);
  82. y[i]:=z[i]/(1-v+k[i]*v)*k[i];
  83. end;
  84. for i:=1 to 3 do
  85. begin
  86. acc[i]:=0.46*r*r*tk[i]*tk[i]/pk[i];
  87. 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];
  88. alfaT[i]:=(1+m*(1-sqrt(t/tk[i])))*(1+m*(1-sqrt(t/tk[i])));
  89. ac[i]:=acc[i]*alfaT[i];
  90. bc[i]:=0.078*r*tk[i]/pk[i];
  91. end;
  92.  
  93. for i:=1 to 3 do
  94. for j:=1 to 3 do
  95. begin
  96. am:=am+(1-cb[i,j])*x[i]*x[j]*sqrt(ac[i]*ac[j]);
  97. end;
  98. for i:=1 to 3 do
  99. begin
  100. bm:=bm+x[i]*bc[i];
  101. end;
  102. a:=bm-r*t/pp;
  103. b:=(r*t*(am-2*b))/pp-3*bm*bm;
  104. cc:=bm*bm*bm+r*t*(bm*bm-am*bm)/pp;
  105. kardano(a,b,cc,2,zl); {коэф. сферхсжим жля жидк. фазы, из ур. PR}
  106. for i:=1 to 3 do
  107. for j:=1 to 3 do
  108. begin
  109. am:=am+(1-cb[i,j])*y[i]*y[j]*sqrt(ac[i]*ac[j]);
  110. end;
  111. for i:=1 to 3 do
  112. begin
  113. bm:=bm+y[i]*bc[i];
  114. end;
  115.  
  116. a:=bm-r*t/pp;
  117. b:=(r*t*(am-2*b))/pp-3*bm*bm;
  118. cc:=bm*bm*bm+r*t*(bm*bm-am*bm)/pp;
  119. kardano(a,b,cc,1,zv); {коэф. сферхсжим жля пар. фазы, из ур. PR}
  120.  
  121. for i:=1 to 3 do
  122. begin
  123. psi:=0.37+1.57*w[i]-0.27*sqr(w[i]);
  124. fipr:=sqr(1+psi*(1-sqrt(t/tk[i])));
  125. 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]))));
  126. 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]))));
  127. fl[i]:=fil*pp*z[i];
  128. fv[i]:=fiv*pp*z[i];
  129. end;
  130.  
  131. summa:=0;
  132. for i:=1 to 3 do
  133. begin
  134. k[i]:=fl[i]/fv[i];
  135. summa:=summa+(1-k[i])*(1-k[i]);
  136. end;
  137. until summa<1e-8;
  138. writeln(x[1],x[2],x[3]);
  139. writeln(y[1],y[2],y[3]);
  140.  
  141. end.

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

textual
Листинг программы
  1. if beta>0 then x:=exp(ln(beta)/3)
  2. else if beta=0 then x:=0
  3. else x:=-exp(ln(-beta)/3);
  4. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут