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

start [/forum/topic.php?fid=58&msg=39961625&tid=2038289]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 343ms |

| 0 / 0 |
