powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / 1<>1
15 сообщений из 15, страница 1 из 1
1<>1
    #39961619
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здравствуйте.
У меня есть вот такой код:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  var
    Value:Extended;
   ...  
  procedure FindSolution();  
  begin 
     ...
     if Value>1 then
       //Делаем определенные действия
     else
       //Найдено решение
  end;


Само значение Value получается как сумма сложения десятичных дробей, т.е. там дробная часть достаточно длинная может быть.
И почему то иногда не срабатывает условие , что решение найдено. Я даже перевел специально для проверки значение Value в строку,
и параллельно вывожу Value в Edit, в Edit значение единица, однако он выполняет все равно первое условие. Может какие то значения накапливается, то что компилятор не видит?
...
Рейтинг: 0 / 0
1<>1
    #39961624
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85,

Используй RoundTo до n - знаков
...
Рейтинг: 0 / 0
1<>1
    #39961625
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85,

в любом числе с плавающей запятой есть какая-то погрешность. Вот на нее ты и нарвался.
...
Рейтинг: 0 / 0
1<>1
    #39961629
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Советую почитать книгу "О чем не пишут в книгах по Delphi" ;)
...
Рейтинг: 0 / 0
1<>1
    #39961638
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот таким образом срабатывает:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  var
    Value:Extended;
   ...  
  procedure FindSolution();  
  var
    st:string;
  begin 
     ...
    st:=FloatToStr(Value); 
    if st<>'1' then
       //Делаем определенные действия
     else
       //Найдено решение
  end;


Но тут конечно мне повезло, я только неравенство проверяю, а в случае проверки значения на больше или меньше чего либо могло и
не сработать. Да, кстати, спасибо напомнили про эту книгу. Сейчас припоминаю, там речь шла о машинном эпсилоне, вроде в нем причина, надо посмотреть.
...
Рейтинг: 0 / 0
1<>1
    #39961642
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko,
да кстати, это тоже помогло. Надо посмотреть насколько точно будет с другими примерами. Я до этого использовал функцию SimpleRoundTо, но на слагаемых, а не на результате. Это давало большую погрешность и , в результате, неправильный ответ.
...
Рейтинг: 0 / 0
1<>1
    #39961711
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85,
вот статья "Неочевидные особенности вещественных чисел", автора упомянутой книги:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
...
Рейтинг: 0 / 0
1<>1
    #39961722
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всегда сравнивайте вещественные приближенные числа (не путайте с вещественными точными) через погрешность...

Например:
if abs(a - b) < 0.0001 then
т.е. они равны если вас устраивает точность в десятитысячную

В математике только так их и сравнивают. Есть некое епсилон и т.д.
...
Рейтинг: 0 / 0
1<>1
    #39961729
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, с типом Double не помню, были ли когда-либо проблемы с эпсилоном (как у автора). А вот с Extended постоянно
...
Рейтинг: 0 / 0
1<>1
    #39961739
Damir_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да вот с типом double кстати еще не пробовал.
А округление roundto не помогло. Например, строка показывает st='1.000274567', а округление до трех знаков уже дало 1.
Можно конечно больше кол-во знаков поставить для округления, но тоже неизвестно где там оно закончится это число.
Спасибо за ссылки. Давно хотел с вещественными числам поподробней разобраться, вот видимо на реальной ситуации и возникла
необходимость
...
Рейтинг: 0 / 0
1<>1
    #39961741
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85
А округление roundto не помогло.

Оно и не обязательно должно помочь.
Два разных числа после округления тоже могут быть двумя разными числами.
Вещественные числа надо всегда только через допустимый для тебя эпсилон сравнивать.

Код: pascal
1.
if Abs( r1 - r2 ) > 0.001 then
...
Рейтинг: 0 / 0
1<>1
    #39961742
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Damir_85
да вот с типом double кстати еще не пробовал.
А округление roundto не помогло. Например, строка показывает st='1.000274567', а округление до трех знаков уже дало 1.
Можно конечно больше кол-во знаков поставить для округления, но тоже неизвестно где там оно закончится это число.
Спасибо за ссылки. Давно хотел с вещественными числам поподробней разобраться, вот видимо на реальной ситуации и возникла
необходимость
А кто кроме тебя это должен знать?
...
Рейтинг: 0 / 0
1<>1
    #39961756
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite
В математике только так их и сравнивают
Э...

Кроик Семён
кстати, с типом Double не помню, были ли когда-либо проблемы с эпсилоном (как у автора). А вот с Extended постоянно
Думаю, легко можно получить проблему даже с типом Single.
...
Рейтинг: 0 / 0
1<>1
    #39961758
luigi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
function CompareValue(const A, B: Extended; Epsilon: Extended): TValueRelationship;



модуль Math
...
Рейтинг: 0 / 0
1<>1
    #39961777
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
luigi
Код: pascal
1.
function CompareValue(const A, B: Extended; Epsilon: Extended): TValueRelationship;



модуль Math


Надо же. Век живи, век учись.
Оттуда же (с возможностью автоподстановки минимально допустимого эпсилона по типам)

Код: pascal
1.
function SameValue(const A, B: Extended/Double/Single; Epsilon: Extended/Double/Single = 0): Boolean;


Очень полезные функции там нашлись, спасибо.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / 1<>1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]