While Do Проблем
2 отговора
146 прегледа
While Do Проблем
Здравейте ,
Можете ли да ми помогнете имам следния проблем:
procedure TForm1.Button1Click(Sender: TObject);
var i:Extended;step:extended;
begin
step := 0.1;
i := 0;
while (i < 10.0) do i := i + Step;
ShowMessage(FloatToStr(i));
// "i" trqbva da bude 10 i e taka
step := 0.1;
i := 0;
while (i <= 10.0) do i := i + Step;
ShowMessage(FloatToStr(i));
//"i" trqbva da bude 10,1 ama ne e ?????
end;
Ако направя i,step: real ili double и в двата случая е 10,1
Защо се получава така?Ако step е 0,2 или 0,25 си работи нормално
Предварително благодаря.
Можете ли да ми помогнете имам следния проблем:
procedure TForm1.Button1Click(Sender: TObject);
var i:Extended;step:extended;
begin
step := 0.1;
i := 0;
while (i < 10.0) do i := i + Step;
ShowMessage(FloatToStr(i));
// "i" trqbva da bude 10 i e taka
step := 0.1;
i := 0;
while (i <= 10.0) do i := i + Step;
ShowMessage(FloatToStr(i));
//"i" trqbva da bude 10,1 ama ne e ?????
end;
Ако направя i,step: real ili double и в двата случая е 10,1
Защо се получава така?Ако step е 0,2 или 0,25 си работи нормално
Предварително благодаря.
Редактирано от trump на
Re: While Do Проблем
Както написа един колега във форума преди време "Аритметиката с плаваща запетая не прощава на никого!"
А колко е, като не е 10.1? Предполагам, че е нещо много близо до 10.1, нали?
Когато работиш с числа с плаваща запетая има едно желязно правило, което трябва да спазваш - забрави за използване на '='!!! Сравненията трябва да са ти от вида i = 10.1 +/- epsilon, където epsilon ти е някаква достатъчно малко число (зависи от случая, но при теб май би свършило работа 0.01 например). Това можеш да реализираш с "логическо и" (по-голямо от 10.1 - epsilon И по-малко от 10.1 + epsilon) или със сравнение на абсолютната стойност (abs(i - 10.1) < epsilon).
А колко е, като не е 10.1? Предполагам, че е нещо много близо до 10.1, нали?
Когато работиш с числа с плаваща запетая има едно желязно правило, което трябва да спазваш - забрави за използване на '='!!! Сравненията трябва да са ти от вида i = 10.1 +/- epsilon, където epsilon ти е някаква достатъчно малко число (зависи от случая, но при теб май би свършило работа 0.01 например). Това можеш да реализираш с "логическо и" (по-голямо от 10.1 - epsilon И по-малко от 10.1 + epsilon) или със сравнение на абсолютната стойност (abs(i - 10.1) < epsilon).