pascal条件的麻烦



我正在用Pascal编写程序。还有一些条件方面的问题。

例如,如果你输入input
1 1
14
5 1
2 2

tArea1 = 6 and sumAreas = 6 too
但在"if"结构中,这不能正常工作。

请帮帮我。Tnx .

var
  x1,x2,x3,x4,y1,y2,y3,y4: real;
  line1Length, line2Length, line3Length : real; // Length of the triangle area
  tArea1, tArea2, tArea3, tArea4, sumAreas : real;
  function segmentLength (x,y,x0,y0:real);
  begin
    segmentLength := sqrt(sqr(x-x0) + sqr(y-y0));
  end;
  function triangleArea (a,b,c:real);
  var
    p: real; // Half of the perimetr
  begin
    p := (a+b+c)/2;
    triangleArea := sqrt(p*(p-a)*(p-b)*(p-c));
  end;
begin
  writeln('write x1,y1');
  readln(x1,y1);
  writeln('write x2,y2');
  readln(x2,y2);
  writeln('write x3,y3');
  readln(x3,y3);
  writeln('write x4,y4');
  readln(x4,y4);
  // First triangle
  line1Length := segmentLength(x1,y1,x2,y2);
  line2Length := segmentLength(x2,y2,x3,y3);
  line3Length := segmentLength(x3,y3,x1,y1);
  tArea1 := triangleArea(line1Length, line2Length, line3Length);
  // Second triangle
  line1Length := segmentLength(x4,y4,x2,y2);
  line2Length := segmentLength(x2,y2,x3,y3);
  line3Length := segmentLength(x3,y3,x4,y4);
  tArea2 := triangleArea(line1Length, line2Length, line3Length);
  // Third triangle
  line1Length := segmentLength(x4,y4,x1,y1);
  line2Length := segmentLength(x1,y1,x3,y3);
  line3Length := segmentLength(x3,y3,x4,y4);
  tArea3 := triangleArea(line1Length, line2Length, line3Length);
  // Fourth Triangle
  line1Length := segmentLength(x4,y4,x1,y1);
  line2Length := segmentLength(x1,y1,x2,y2);
  line3Length := segmentLength(x2,y2,x4,y4);
  tArea4 := triangleArea(line1Length, line2Length, line3Length);
  // Check dot situated
  sumAreas := tArea4+tArea2+tArea3;
  writeln(tArea1, ' // ', sumAreas); //
  if (sumAreas = tArea1) then
  begin
    writeln('In');
  end
  else
  begin
    writeln('Out');
  end;
end.

由于计算机表示浮点数的方式,在比较两个看起来相同的数字时可能会出现不一致的情况。与整数不同,IEEE浮点数只是近似值,而不是精确数。由于需要将数字转换成计算机可以存储的二进制形式,因此精度或舍入偏差较小。例如,1.3实际上可以表示为1.29999999999

因此,永远不要使用=<>来比较两个浮点数。相反,将这两个数字相减,并将它们与一个非常小的数字进行比较。

对于你的情况,尝试使用:

 if abs(sumAreas - tArea1) < 0.00001 then

在使用StrToFloatTextToFloatStrToCurr等转换函数时可能会出现特别的问题

 if FloatToStr(sumAreas) = FloatToStr(tArea1) then

也可以,但不推荐:

if Round(sumAreas) = Round(tArea1) then

参考:比较浮点数的问题

您正在将浮点值与相等(=)操作符进行比较。在比较浮点值时,非常小的值差异(由于数字原因)可能导致偏差,从而导致比较失败。

一个更好的相等性检验是

 if abs(value-valuetocompareto)<eps then
   writeln('bingo') 
 else
   writeln('tryagain');
带eps的

表示允许偏离的值的适当公差。(尝试从0.0001开始)

如果是家庭作业,则在注释中添加基于逻辑或数字数学的EPS大小的动机。

相关内容

  • 没有找到相关文章

最新更新