
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
25.05.2020, 11:47
|
|||
|---|---|---|---|
1<>1 |
|||
|
#18+
здравствуйте. У меня есть вот такой код: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Само значение Value получается как сумма сложения десятичных дробей, т.е. там дробная часть достаточно длинная может быть. И почему то иногда не срабатывает условие , что решение найдено. Я даже перевел специально для проверки значение Value в строку, и параллельно вывожу Value в Edit, в Edit значение единица, однако он выполняет все равно первое условие. Может какие то значения накапливается, то что компилятор не видит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2020, 11:52
|
|||
|---|---|---|---|
|
|||
1<>1 |
|||
|
#18+
Damir_85, Используй RoundTo до n - знаков ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2020, 11:52
|
|||
|---|---|---|---|
1<>1 |
|||
|
#18+
Damir_85, в любом числе с плавающей запятой есть какая-то погрешность. Вот на нее ты и нарвался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2020, 11:56
|
|||
|---|---|---|---|
1<>1 |
|||
|
#18+
Советую почитать книгу "О чем не пишут в книгах по Delphi" ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2020, 12:26
|
|||
|---|---|---|---|
1<>1 |
|||
|
#18+
Вот таким образом срабатывает: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Но тут конечно мне повезло, я только неравенство проверяю, а в случае проверки значения на больше или меньше чего либо могло и не сработать. Да, кстати, спасибо напомнили про эту книгу. Сейчас припоминаю, там речь шла о машинном эпсилоне, вроде в нем причина, надо посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2020, 12:33
|
|||
|---|---|---|---|
1<>1 |
|||
|
#18+
Gerasimenko, да кстати, это тоже помогло. Надо посмотреть насколько точно будет с другими примерами. Я до этого использовал функцию SimpleRoundTо, но на слагаемых, а не на результате. Это давало большую погрешность и , в результате, неправильный ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2020, 14:40
|
|||
|---|---|---|---|
1<>1 |
|||
|
#18+
Damir_85, вот статья "Неочевидные особенности вещественных чисел", автора упомянутой книги: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2020, 14:52
|
|||
|---|---|---|---|
1<>1 |
|||
|
#18+
Всегда сравнивайте вещественные приближенные числа (не путайте с вещественными точными) через погрешность... Например: if abs(a - b) < 0.0001 then т.е. они равны если вас устраивает точность в десятитысячную В математике только так их и сравнивают. Есть некое епсилон и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2020, 15:00
|
|||
|---|---|---|---|
|
|||
1<>1 |
|||
|
#18+
кстати, с типом Double не помню, были ли когда-либо проблемы с эпсилоном (как у автора). А вот с Extended постоянно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2020, 15:23
|
|||
|---|---|---|---|
1<>1 |
|||
|
#18+
да вот с типом double кстати еще не пробовал. А округление roundto не помогло. Например, строка показывает st='1.000274567', а округление до трех знаков уже дало 1. Можно конечно больше кол-во знаков поставить для округления, но тоже неизвестно где там оно закончится это число. Спасибо за ссылки. Давно хотел с вещественными числам поподробней разобраться, вот видимо на реальной ситуации и возникла необходимость ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2020, 15:33
|
|||
|---|---|---|---|
1<>1 |
|||
|
#18+
Damir_85 А округление roundto не помогло. Оно и не обязательно должно помочь. Два разных числа после округления тоже могут быть двумя разными числами. Вещественные числа надо всегда только через допустимый для тебя эпсилон сравнивать. Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2020, 15:36
|
|||
|---|---|---|---|
|
|||
1<>1 |
|||
|
#18+
Damir_85 да вот с типом double кстати еще не пробовал. А округление roundto не помогло. Например, строка показывает st='1.000274567', а округление до трех знаков уже дало 1. Можно конечно больше кол-во знаков поставить для округления, но тоже неизвестно где там оно закончится это число. Спасибо за ссылки. Давно хотел с вещественными числам поподробней разобраться, вот видимо на реальной ситуации и возникла необходимость ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2020, 16:11
|
|||
|---|---|---|---|
|
|||
1<>1 |
|||
|
#18+
X-Cite В математике только так их и сравнивают Кроик Семён кстати, с типом Double не помню, были ли когда-либо проблемы с эпсилоном (как у автора). А вот с Extended постоянно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2020, 16:15
|
|||
|---|---|---|---|
1<>1 |
|||
|
#18+
Код: pascal 1. модуль Math ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2020, 17:00
|
|||
|---|---|---|---|
1<>1 |
|||
|
#18+
luigi Код: pascal 1. модуль Math Надо же. Век живи, век учись. Оттуда же (с возможностью автоподстановки минимально допустимого эпсилона по типам) Код: pascal 1. Очень полезные функции там нашлись, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=58&mobile=1&tid=2038289]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
| others: | 229ms |
| total: | 376ms |

| 0 / 0 |
