Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2014, 18:18   #1
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию Range IN Real

Интересует такой вопрос, как проверить вещественное число, принадлежит ли оно промежутку, например есть число 5.2, проверить принадлежит ли оно промежутку 5.1 и 5.3. Кто знает?

Последний раз редактировалось Winexcel; 19.08.2014 в 18:34.
Winexcel вне форума Ответить с цитированием
Старый 19.08.2014, 18:35   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так, например, если точность до одного знака после запятой
Код:
x:=5.2;
if (x>5.09) and (x<5.31) then ...
А так можно на грабли нарваться, что 5.1<>5.1
Код:
if (x>=5.1) and (x<=5.3) then ...
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.08.2014, 18:59   #3
Winexcel
Форумчанин
 
Регистрация: 26.08.2013
Сообщений: 187
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Так, например, если точность до одного знака после запятой
Код:
x:=5.2;
if (x>5.09) and (x<5.31) then ...
А так можно на грабли нарваться, что 5.1<>5.1
Код:
if (x>=5.1) and (x<=5.3) then ...
Большое спасибо, то что нужно, под вечер плохо думаться стало, полез в наборы, и оператор in...
Winexcel вне форума Ответить с цитированием
Старый 19.08.2014, 19:14   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А так можно на грабли нарваться, что 5.1<>5.1
Код:
if (x>=5.1) and (x<=5.3) then ...
Аватар, а в чем прикол с 5.1<>5.1?
Sibedir вне форума Ответить с цитированием
Старый 19.08.2014, 19:25   #5
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Аватар, а в чем прикол с 5.1<>5.1?
http://www.softelectro.ru/ieee754.html
Если коротко, то никто не гарантирует соблюдения математических тождеств - число разрядов ограничено.
Поэтому проверка на строгое равенство с вещественными числами - это плохой признак (оно имеет смысл в некоторых ситуациях, но там обычно человек уже понимает как это работает) =-)
StriderX вне форума Ответить с цитированием
Старый 19.08.2014, 19:33   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Sibedir
Код:
procedure TForm1.Button1Click(Sender: TObject);
var x,y: Real;
begin
  x:=5.1;
  y:=x+0.01;
  y:=y+0.89;
  y:=y-0.9;
  if x=y then Label1.Caption:='равно' else Label1.Caption:='не равно';
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 19.08.2014 в 19:37.
Аватар вне форума Ответить с цитированием
Старый 19.08.2014, 19:46   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Есть функция InRange из модуля Math, в нём вообще много всего для подобных задач, сам пользуюсь постоянно, во многих можно даже регулировать эпсилон для подобных сравнений, и будет надёжно, в отличие от велосипедов.
phomm вне форума Ответить с цитированием
Старый 19.08.2014, 19:53   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
function InRange(const AValue, AMin, AMax: Double): Boolean;
begin
  Result := (AValue >= AMin) and (AValue <= AMax);
end;
И чего там такого, те же грабли могут быть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.08.2014, 21:08   #9
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Да, я удивлён, думал, что там используется CompareValue (которую я сам использую), и вот она-то учитывает и эпсилон и представление вещественных чисел.
Тогда можно свою InRange написать с CompareValue
phomm вне форума Ответить с цитированием
Старый 20.08.2014, 02:55   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Так, например, если точность до одного знака после запятой
Код:
x:=5.2;
if (x>5.09) and (x<5.31) then ...
А так можно на грабли нарваться, что 5.1<>5.1
Код:
if (x>=5.1) and (x<=5.3) then ...
Главное - не использовать без крайней необходимости неродные для матсопроцессора типы вещественных переменных. Этого достаточно чтобы не иметь проблем в их сравнении.
P.S.
Но для реальных, а не учебных задач сравнение двух вещественных переменных на строгое равенство это действительно полная безграмотность разработчика.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
range() deduschka PHP 4 17.01.2014 23:23
задать range arbitr.ru Microsoft Office Excel 2 09.11.2012 15:39
Range WizarD.89 Microsoft Office Excel 7 29.04.2011 18:42
MS Word: Range kate4ka Общие вопросы Delphi 1 19.02.2008 06:14
как перевести из integer в real(и обратно), и из real в string(и обратно) Ga-sergey Общие вопросы Delphi 2 08.06.2007 21:13