Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не сравниваются числа, программа считает числа неодинаковыми 
V
    Опции темы
valerchi
Дата 27.1.2014, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Всем привет. Пожалуйста объясните, что происходит. Есть массив чисел (Real) и переменная такого же типа. Визуально вижу, что в массиве есть числа, которые равны переменной, (допустим masa[0]=0.74,  и переменная x=0.74), а программа их считает разными. Что не так?
Вот несколько строчек из кода:
Код

d:=i;
y:=0.00;
repeat
x:=0;
y:=y+0.01;
i:=-1;
repeat
inc(i);
if masb[i]=y then
inc(x);
until i=d;


Добавлено @ 12:40
Может это прояснит ситуацию, добавляю строку кода, как наполняется массив (Real):
Код

masb[i]:=round(masa[w]/masa[s]*100)/100;


Это сообщение отредактировал(а) valerchi - 27.1.2014, 13:10
PM MAIL   Вверх
Агрох
Дата 27.1.2014, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: 1
Всего: 6



Попробуйте использовать тип Double вместо Real.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
valerchi
Дата 27.1.2014, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Спасибо, сейчас попробую

Добавлено через 8 минут и 17 секунд
Не помогло, всё то же самое
PM MAIL   Вверх
Агрох
Дата 27.1.2014, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: 1
Всего: 6



Можно всё таки уточнить, что с чем сравнивается. В описании проблемы сравниваете masa и x, в приведённом коде  masb и y, а x в последнем может быть только целым.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
valerchi
Дата 27.1.2014, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Агрох
Дата 27.1.2014, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: 1
Всего: 6



Можно более полную версию кода? Чтобы все циклы были видны.
В том что есть пока видно, что x у вас постоянно сбрасывается в ноль, после того как вы переходите к следующему значению y.

Проверьте в режиме отладки, что строка inc(x); не обрабатывается.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Illusion Dolphin
Дата 27.1.2014, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 5
Всего: 63



Числа с плавающей запятой надо сравнивать с учётом погрешности. http://stackoverflow.com/questions/6106119...ouble-in-delphi
Т.е. вместо
Код

if double1 = double2 then


надо

Код

if Abs(double1 - double2) < [чего-то маленького] then


Это сообщение отредактировал(а) Illusion Dolphin - 27.1.2014, 17:29


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
valerchi
Дата 27.1.2014, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Попробовал так
Код

if double(masb[i])=double(y) then

ничего не получилось
PM MAIL   Вверх
valerchi
Дата 27.1.2014, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Только что округлил числа до десятых, начало получаться... но мне нужно до тысячных, хотя бы до сотых

Добавлено через 10 минут и 54 секунды
Получилось, сделал так:
Код

if floattostr(masb[i])=floattostr(y) then
inc(x);

вроде работает

Добавлено через 14 минут и 2 секунды
Всем спасибо!
PM MAIL   Вверх
Poseidon
Дата 27.1.2014, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



На самом деле с вещественными числами не все так просто. И если в коде у нас x := 0.74, то это не означает, что условие x = 0.74 будет выполняться, потому как при присвоении в x на самом деле будет храниться что, то вроди 0.739999999999 или 0.7400000001. Это обусловленно округлением, которое происходит при переводе числа в двоичную систему. 

Советую почитать эту статью, что бы понять как в Delphi организована работа с вещественными числами. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
valerchi
Дата 27.1.2014, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Да, действительно, при выведении результата на экран были такие числа, (что, то вроде 0.739999999999 или 0.7400000001). Спасибо за инфу.
PM MAIL   Вверх
valerchi
Дата 28.1.2014, 03:43 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 27.5.2008
Где: Геническ

Репутация: нет
Всего: нет



Опять вылезли ошибки, исправил их создав string переменную с определённым кол-вом знаков и всё получилось. Может кому-то пригодится:
Код

var ... n:string[5];
....
....
....
n:=floattostr(masa[w]/masa[s]);
masb[i]:=strtofloat(n);
....
....
....
repeat
x:=0;
n:=floattostr(y+0.001);
y:=strtofloat(n);
i:=-1;
repeat
inc(i);
if floattostr(masb[i])=floattostr(y) then
inc(x);
until i=d;

PM MAIL   Вверх
БелАмор
Дата 28.1.2014, 07:43 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 7
Всего: 17



Цитата(valerchi @  28.1.2014,  04:43 Найти цитируемый пост)
исправил их создав string переменную с определённым кол-вом знаков и всё получилось

Извините за резкозть, но вы занимаетесь ерундой...
Сравнивайте числа с точностью до заданного значения.
Либо вручную, либо используя специально предназаченные для этого функции:

SameValue и CompareValue (модуль Math, константы - модуль Types)

А для того, чтобы иметь правильное понимание, я таки рекомендую прочитать статью, ссылу на которую здесь уже приводили:
Неочевидные особенности вещественных чисел

PM   Вверх
Poseidon
Дата 29.1.2014, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(valerchi @  28.1.2014,  03:43 Найти цитируемый пост)
Может кому-то пригодится:
Вам бы к индусам на стажировку.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1358 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.