帕斯卡条件的问题
Troubles with pascal conditions
我正在用 Pascal 编写程序。并且在条件上遇到一些麻烦。
例如,如果您输入
1 1
1 4
5 1
2 2
tArea1
= 6 和 sumAreas
= 6 也是
但是在 "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.
您正在将浮点值与等式 (=) 运算符进行比较。在比较浮点值时,一个非常小的值差异(由于数值原因)会导致偏差,导致比较失败。
更好的平等测试是
if abs(value-valuetocompareto)<eps then
writeln('bingo')
else
writeln('tryagain');
使用 eps 可以适当容忍一个值允许偏离多少。 (尝试从 0.0001 开始)
如果是家庭作业,请在评论中添加基于逻辑或数字数学的 EPS 大小的动机。
由于计算机表示浮点数的方式,在比较两个看似相同的数字时可能会出现不一致。与整数不同,IEEE 浮点数只是近似值,而不是精确数。将数字转换为计算机可以以二进制形式存储的形式的需要会导致较小的精度或舍入偏差。例如 1.3
实际上可能表示为 1.29999999999
。
因此,您永远不应使用 =
或 <>
来比较两个浮点数。相反,减去这两个数字并将它们与一个非常小的数字进行比较。
对于你的情况尝试使用:
if abs(sumAreas - tArea1) < 0.00001 then
在使用StrToFloat
、TextToFloat
、StrToCurr
等转换函数时可能会出现问题
if FloatToStr(sumAreas) = FloatToStr(tArea1) then
也可以,但不推荐:
if Round(sumAreas) = Round(tArea1) then
参考:
比较浮点数的问题。
我正在用 Pascal 编写程序。并且在条件上遇到一些麻烦。
例如,如果您输入
1 1
1 4
5 1
2 2
tArea1
= 6 和 sumAreas
= 6 也是
但是在 "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.
您正在将浮点值与等式 (=) 运算符进行比较。在比较浮点值时,一个非常小的值差异(由于数值原因)会导致偏差,导致比较失败。
更好的平等测试是
if abs(value-valuetocompareto)<eps then
writeln('bingo')
else
writeln('tryagain');
使用 eps 可以适当容忍一个值允许偏离多少。 (尝试从 0.0001 开始)
如果是家庭作业,请在评论中添加基于逻辑或数字数学的 EPS 大小的动机。
由于计算机表示浮点数的方式,在比较两个看似相同的数字时可能会出现不一致。与整数不同,IEEE 浮点数只是近似值,而不是精确数。将数字转换为计算机可以以二进制形式存储的形式的需要会导致较小的精度或舍入偏差。例如 1.3
实际上可能表示为 1.29999999999
。
因此,您永远不应使用 =
或 <>
来比较两个浮点数。相反,减去这两个数字并将它们与一个非常小的数字进行比较。
对于你的情况尝试使用:
if abs(sumAreas - tArea1) < 0.00001 then
在使用StrToFloat
、TextToFloat
、StrToCurr
if FloatToStr(sumAreas) = FloatToStr(tArea1) then
也可以,但不推荐:
if Round(sumAreas) = Round(tArea1) then
参考: 比较浮点数的问题。