![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| valerchi |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 163 Регистрация: 27.5.2008 Где: Геническ Репутация: нет Всего: нет |
Всем привет. Пожалуйста объясните, что происходит. Есть массив чисел (Real) и переменная такого же типа. Визуально вижу, что в массиве есть числа, которые равны переменной, (допустим masa[0]=0.74, и переменная x=0.74), а программа их считает разными. Что не так?
Вот несколько строчек из кода:
Добавлено @ 12:40 Может это прояснит ситуацию, добавляю строку кода, как наполняется массив (Real):
Это сообщение отредактировал(а) valerchi - 27.1.2014, 13:10 |
||||
|
|||||
| Агрох |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 176 Регистрация: 6.4.2013 Где: Москва Репутация: 1 Всего: 6 |
Попробуйте использовать тип Double вместо Real.
--------------------
Putin here, Putin there, Putin almost everywhere! |
|||
|
||||
| valerchi |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 163 Регистрация: 27.5.2008 Где: Геническ Репутация: нет Всего: нет |
Спасибо, сейчас попробую
Добавлено через 8 минут и 17 секунд Не помогло, всё то же самое |
|||
|
||||
| Агрох |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 176 Регистрация: 6.4.2013 Где: Москва Репутация: 1 Всего: 6 |
Можно всё таки уточнить, что с чем сравнивается. В описании проблемы сравниваете masa и x, в приведённом коде masb и y, а x в последнем может быть только целым.
--------------------
Putin here, Putin there, Putin almost everywhere! |
|||
|
||||
| valerchi |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 163 Регистрация: 27.5.2008 Где: Геническ Репутация: нет Всего: нет |
Чуть неправильно пояснил... В описании я взял пример (не конкретно мою программу)
А в действительности дело обстоит так: числа из массива masa делятся друг на друга, округляются до сотых (или тысячных ), и данные (дробные числа, округлённые до сотых (или тысячных, после запятой)) заносятся в массив masb: (masb[i]:=round(masa[w]/masa[s]*100)/100;), а затем числа из массива masb сравниваются с переменной y, и если есть совпадение, то срабатывает счётчик(переменная x увеличивается на 1 (if masb[i]=y then inc(x);)). Всё вроде должно работать, и числа в массиве masb есть такие, которые должны совпадать по величине с переменной y, но счётчик (переменная x не увеличивается) Это сообщение отредактировал(а) valerchi - 27.1.2014, 16:16 |
|||
|
||||
| Агрох |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 176 Регистрация: 6.4.2013 Где: Москва Репутация: 1 Всего: 6 |
Можно более полную версию кода? Чтобы все циклы были видны.
В том что есть пока видно, что x у вас постоянно сбрасывается в ноль, после того как вы переходите к следующему значению y. Проверьте в режиме отладки, что строка inc(x); не обрабатывается. --------------------
Putin here, Putin there, Putin almost everywhere! |
|||
|
||||
| Illusion Dolphin |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 5 Всего: 63 |
Числа с плавающей запятой надо сравнивать с учётом погрешности. http://stackoverflow.com/questions/6106119...ouble-in-delphi
Т.е. вместо
надо
Это сообщение отредактировал(а) Illusion Dolphin - 27.1.2014, 17:29 -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
||||
|
|||||
| valerchi |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 163 Регистрация: 27.5.2008 Где: Геническ Репутация: нет Всего: нет |
Попробовал так
ничего не получилось |
|||
|
||||
| valerchi |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 163 Регистрация: 27.5.2008 Где: Геническ Репутация: нет Всего: нет |
Только что округлил числа до десятых, начало получаться... но мне нужно до тысячных, хотя бы до сотых
Добавлено через 10 минут и 54 секунды Получилось, сделал так:
вроде работает Добавлено через 14 минут и 2 секунды Всем спасибо! |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 9 Всего: 133 |
На самом деле с вещественными числами не все так просто. И если в коде у нас x := 0.74, то это не означает, что условие x = 0.74 будет выполняться, потому как при присвоении в x на самом деле будет храниться что, то вроди 0.739999999999 или 0.7400000001. Это обусловленно округлением, которое происходит при переводе числа в двоичную систему.
Советую почитать эту статью, что бы понять как в Delphi организована работа с вещественными числами. -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| valerchi |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 163 Регистрация: 27.5.2008 Где: Геническ Репутация: нет Всего: нет |
Да, действительно, при выведении результата на экран были такие числа, (что, то вроде 0.739999999999 или 0.7400000001). Спасибо за инфу.
|
|||
|
||||
| valerchi |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 163 Регистрация: 27.5.2008 Где: Геническ Репутация: нет Всего: нет |
Опять вылезли ошибки, исправил их создав string переменную с определённым кол-вом знаков и всё получилось. Может кому-то пригодится:
|
|||
|
||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 7 Всего: 17 |
Извините за резкозть, но вы занимаетесь ерундой... Сравнивайте числа с точностью до заданного значения. Либо вручную, либо используя специально предназаченные для этого функции: SameValue и CompareValue (модуль Math, константы - модуль Types) А для того, чтобы иметь правильное понимание, я таки рекомендую прочитать статью, ссылу на которую здесь уже приводили: Неочевидные особенности вещественных чисел |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 9 Всего: 133 |
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |