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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2013, 20:25   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Работа с типом real

Доброго времени суток!
Возникла такая проблема, есть программа на C# на ее основе пишу на delphi. Используется тип double. Как мне в delphi сравнивать числа типа real
когда одно вводится в edit, а второе получается с помощью ГПСЧ
Вот кусок кода
Код:
  function getRandom():real;  //ГПСЧ
  begin
    z := (a0 * z0 + b0) / c0;
    z0 := z;
    getRandom:=z/c0;
  end;


  function ex(l:real):real; //простейший поток(интенсивность) на основе экспоненциального распределения
  var
    x:real;
  begin
    x:=getRandom();
    ex:=-Ln(1-x)/l; //return -Math.Log(1 - GetRandom()) / l;
  end;



  procedure prepare();  //формирование очереди заявок по заданному распределению
  var
     temp:real;
     timeArrive:real;
  begin
    a0 := 214013; //величины
    b0 := 2531011;    //для
    c0 := 4294967296; //базового ГПСЧ
    timeLimitWork:=StrToFloat(MainForm.EditLimitWork.Text);
    timeLimitWait:=StrToFloat(MainForm.EditLimitWait.Text);
    intensity:=StrToFloat(MainForm.Editintensity.Text);

    //формирование очереди клиентов
    timeArrive:=0;
    repeat
      Insert(timeArrive);
      timeArrive:=timeArrive+ex(intensity);
      ShowMessage(FloatToStr(max(timeArrive,timeLimitWork)));
    until timeArrive>timeLimitWork;
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 14.10.2013, 20:44   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Как мне в delphi сравнивать числа типа real
когда одно вводится в edit, а второе получается с помощью ГПСЧ
Код не смотрел.
Может, так
Цитата:
n1:=StrToFloat(edit1.text);
n2:=getRandom();

if abs(n1-n2) < 0.00001 then ... // это проверка на равенство
Либо использовать функцию SameValue:
http://docwiki.embarcadero.com/Libra...Math.SameValue
Цитата:
Indicates whether two floating-point values are (approximately) equal.
Call SameValue to determine when two floating-point values are equal, or approximately equal.
A and B are the values to compare.

Последний раз редактировалось Вадим Мошев; 14.10.2013 в 20:46.
Вадим Мошев вне форума Ответить с цитированием
Старый 14.10.2013, 20:44   #3
Makars
 
Регистрация: 12.10.2013
Сообщений: 4
По умолчанию

Так сравнивайте значение из эдита со значением функции. Не понимаю в чём сложность
Код:
if StrToFloat(Edit.Text)>getRandom
...
P.S. Понял я не в теме

Последний раз редактировалось Makars; 14.10.2013 в 20:47.
Makars вне форума Ответить с цитированием
Старый 14.10.2013, 21:14   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Может, так
Присоединяюсь к варианту Вадима
Только я бы сделал так :
Код:
const esp = 0.000000001;

<..>
n1:=StrToFloat(edit1.text);
n2:=getRandom();

if abs(n1-n2) < eps then ... // это проверка на равенство
Poma][a вне форума Ответить с цитированием
Старый 17.10.2013, 17:39   #5
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

а если мне нужно сравнивать на больше?
просто то значение которое вводится из edit равно 2
а то которое генерится и равняется 1,37206381239245e-13
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 17.10.2013, 18:18   #6
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

все решила, просто домножать чтобы избавиться от e-
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 17.10.2013, 18:49   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Sparky Посмотреть сообщение
все решила, просто домножать чтобы избавиться от e-
Не понял зачем домножать. То 1,37206381239245e-13 в человеческом виде будет 0,000000000000137206381239245. На больше или меньше два real-а можно просто сравнивать > или <. Проблема со сравнением чисел с плавающей точкой есть только при проверке на равенство
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.10.2013, 09:42   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Не понял зачем домножать.
поясню.
вот этот код:
Код:
  function getRandom():real;  //ГПСЧ
  begin
    z := (a0 * z0 + b0) / c0;
    z0 := z;
    getRandom:=z/c0;
  end;
...
    a0 := 214013; //величины
    b0 := 2531011;    //для
    c0 := 4294967296; //базового ГПСЧ
даёт значение в миллиарды и триллионы раз меньше единицы (обратите внимание на величину c0, на которую число делится дважды. т.е. фактически, делится на КВАДРАТ c0.
Поэтому, автору топика и понадобилось умножать getRandom на какое-то число (на триллион, например).

я думаю, причина в неадекватном переводе алгоритма на Delphi.
но это неважно. Главное, что Sparky устраивает её генератор ПСЧ.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.10.2013, 09:57   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Дошло. ГПСЧ какой-то странный. С толку сбило название темы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с текстовым типом brednew Общие вопросы Delphi 5 28.10.2012 10:12
Работа с ограниченным типом Alexan-Dwer Паскаль, Turbo Pascal, PascalABC.NET 4 05.02.2012 14:24
Работа с комбинированным типом Stuff Паскаль, Turbo Pascal, PascalABC.NET 1 02.06.2010 23:17
Работа с типом днных STRING Nika2010 Помощь студентам 10 16.02.2010 07:18
Работа с типом Record TheNovice Помощь студентам 4 28.02.2007 17:52