这是我的名单:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
x1, x2, x3, xl, xr, xm, hasil, hasil2: Real;
begin
xl := StrToFloat(Edit1.Text);
xr := StrToFloat(Edit2.Text);
x1 := F1(xl);
x2 := F1(xr);
hasil := x1 * x2;
if hasil > 0 then
begin
ShowMessage('Try Again....!!!');
Edit1.Clear;
Edit2.Clear;
end
else
begin
i := 1;
repeat
xm := (xl + xr) / 2;
x3 := F1(xm);
hasil2 := x1 * x3;
if hasil2 < 0 then
begin
xr := xm;
x2 := x3;
end
else
begin
xl := xm;
x1 := x3;
end;
ListBox1.Items.Add(FloatToStr(xm));
i := i + 1;
until
x3 = 0;
end;
end;
列表是关于BISECTION METHOD .... 问题是.....为什么循环没有停止......
任何人都可以帮助我......请
答案 0 :(得分:6)
计算机上的有限精度浮点运算是不精确的。并非所有数字都可以准确表示,因此计算机上的算术涉及近似值。因此,您的功能可能在计算机上没有确切的解决方案。或许解决方案存在,但近似意味着无法找到它。
测试您的值接近零,而不是测试零等于。
until abs(x3) < 1.0e-6;
必须根据基于手头问题的一些合理论证来选择容差。
二分法的另一个明智的停止标准是xl和xr变得非常接近。究竟什么方法最适合您取决于您要解决的功能,以及您需要该解决方案的属性。
这些问题很微妙。如果使用公差,则可能选择它太低。然后你的循环不会终止,这是一个熟悉的情况。因此,在经过大量迭代后,您应该总是试图挽救。除非你能确定循环肯定会终止。
有关调试的一些建议。你已经知道循环没有终止。很明显x3并没有达到零。此时您可以完成一些调试并检查x3的值以及其他变量。如果你这样做了,我相信你会自己理解这个问题。学习如何调试问题是一项至关重要的技能。