IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Проблема с определением целочисленности
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


Доброго времени суток!

При написании программы возникла непонятная проблема.


var
f: text;
l, a, b, r: real;
i: integer;
k: byte;

begin
Assign(f, 'input.txt');
Reset(f);
Readln(f, l);
Readln(f, a);
Readln(f, b);
close(f);

r := a;
k := 0;

for i := 1 to round(l / a) do
begin
if (r / b = round(r / b)) then inc(k);
r := r + a;
writeln(r, ' - ',r / b:10:10,' = ', round(r / b),' - ',r / b = round(r / b));
end;

Assign(f, 'output.txt');
Rewrite(f);
write(f, k);
close(f);

end.



Начальные значения:


l = 10.5
a = 1.005
b = 0.004



Результаты:
Изображение

На картинке видно, что почему-то при верном равенстве на результат выводит fasle.

В чём проблема?

Заранее спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
В чём проблема?
В погрешности представления вещественных чисел. Нельзя сравнивать вещественное число ни с другим вещественным (ни тем более с целым) оператором "=", можно только смотреть, насколько одно отличается от другого, и если модуль разности не превышает какого-то граничного значения - то считать числа равными.

Цитата
На картинке видно, что почему-то при верном равенстве
На картинке - это результат вывода. Вывод происходит с округлением. Посмотри в отладчике, чему равны значения r/b перед выполнением WriteLn, тогда продолжим разговор.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


Результаты деления в данном случае равны:
4,02 / 0,004 = 1005
8,10 / 0,004 = 2010

Посчитал вручную. Всё должно получатся, по-моему.

Однако, при выводе
frac(r/b);

получаю бесконечную десятичную дробь, соответственно 0.999999999999886 и 0.999999999999773

dry.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Турбо-Паскаль, при отключенном сопроцессоре (режим {$N-}):

 2.0100000000E+00 -      502.50000000000 = 503 - FALSE
3.0150000000E+00 - 753.75000000000 = 754 - FALSE
4.0200000000E+00 - 1005.00000000000 = 1005 - TRUE
2.0100000000E+00 - 502.50000000000 = 503 - FALSE
3.0150000000E+00 - 753.75000000000 = 754 - FALSE
4.0200000000E+00 - 1005.00000000000 = 1005 - TRUE
5.0250000000E+00 - 1256.25000000000 = 1256 - FALSE
6.0300000000E+00 - 1507.50000000000 = 1507 - FALSE
7.0350000000E+00 - 1758.75000000000 = 1759 - FALSE
8.0400000000E+00 - 2010.00000000000 = 2010 - TRUE
9.0450000000E+00 - 2261.25000000000 = 2261 - FALSE
1.0050000000E+01 - 2512.50000000000 = 2513 - FALSE
1.1055000000E+01 - 2763.75000000000 = 2764 - FALSE

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


Хммм.. Странно. В Pascal ABC по другому. И отключённый сопроцессор не помогает. Попробую Free Pascal.

Возможно ещё как нибудь проверить целочисленность чисел?

unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


FPC выдает те же результаты, что приведены в первом посте, отключить сопроцессор там нельзя.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской

Репутация: -  0  +


А как на счёт другого случая? Как ещё можно проверить целое ли число?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Uses Math;
Var l, a, b, r: Extended;
// ...
writeln(..., SameValue(r/b, trunc(r/b)));
(FPC)

Сообщение отредактировано: IUnknown -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 16.05.2024 4:47
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name