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

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

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

> Проблема с определением целочисленности
looogle
сообщение 5.01.2012 14:42
Сообщение #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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 7)
IUnknown
сообщение 5.01.2012 16:01
Сообщение #2


a.k.a. volvo877
*****

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

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


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

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


Новичок
*

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

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


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

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

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

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

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


a.k.a. volvo877
*****

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

Репутация: -  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 
 К началу страницы 
+ Ответить 
looogle
сообщение 5.01.2012 18:22
Сообщение #5


Новичок
*

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

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


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

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

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


a.k.a. volvo877
*****

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

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


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


Новичок
*

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

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


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


a.k.a. volvo877
*****

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

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


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

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

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

 



- Текстовая версия 20.07.2025 3:09
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"