Другие языки программирования и технологии

Почему казалось бы простой код не работает в Турбо Паскале?

Почему код с не работает корректно??Программа должна проверить, входит ли X в множество 0.8, 0.9, 1.0...2.0Когда пользователь вводит Х=0.9, то при выполнении строки: if (X=X1) then begin VhoditVInt:=true;break;end;при значении X1=0.9, значение выражения (X=X1) - ложь.Отчего бы это так???var X1,X:real; VhoditVInt:boolean;begin readln(X); VhoditVInt:=false; X1:=0.7; while X1<=2.0 do begin if (X=X1) then begin VhoditVInt:=true;break;end; X1:=X1+0.1; end; if Not VhoditVInt then write('не '); Writeln('входит в интервал'); readln;end.
Т. к. регистры имеют конечную разрядность и числа хранятся в двоичной форме,
сравнивать на строгое равенство два вещественных числа неправильно.
В математическом анализе равенство двух вещественных чисел определяется следующим образом:
Вещественные числа x и y равны, если для любого (сколь угодно малого) eps > 0
|x-y| < eps. То есть, разность этих чисел меньше любого наперёд заданного числа.
Фактически eps играет роль точности сравнения.
Поэтому в программах именно так и делается, когда нужно сравнить два вещественных числа:
вводится некоторая точность eps (достаточно малая, скажем, 1e-4) и сравнивается значение модуля
разности этих чисел с eps:
function isEqual(x,y:real):boolean;
const eps: real = 1e-4;
begin
isEqual := abs(x-y) < eps
end;
Алексей Сенькин
Алексей Сенькин
3 769
Лучший ответ
А почему не так делаете проверку на вхождение в диапазон?
if (x >= 0.8) and (x <= 2.0) then begin
VhoditVInt := true;
break;
end;
Очевидно это из за неточности математического нуля. Прибавляя 0.1 вы возможно прибавляете 0.1000000001. И поэтому условие не выполняется. Попробуйте вывести на экран само число Х1 перед сравнением.

UPD: Если действительно прибавляется неточное 0.1, то как вариант можно сделать небольшой хак.
После ввода числа умножать его на 10 и присваивать переменной типа integer. Тогда оно будет [10, 11...19,20] А потом сравнивать с этими числами, прибавляя каждый раз еденицу (целочисленную)
вот так напиши

VhoditVInt:=false;
X1:=0.7;
while ((X1<=2.0) and not( VhoditVInt )) do begin
VhoditVInt:= (X=X1);
X1:=X1+0.1;
end;
Булат Бекесов
Булат Бекесов
2 751
X1 присвой 0.8 а не 0.7