![]() |
Модераторы: Alx, Fixin |
![]() ![]() ![]() |
|
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: нет Всего: 92 |
это тест на внимательность? ![]() cmp1( 1, 2 ) != cmp2( 1, 2 ); Или "одинаковые функции" - это какой то специальный термин? |
|||
|
||||
Ln78 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
zkv, я прошу прощения, это оказался тест на внимательность для самого меня. Здесь действительно опечатка, должно быть, конечно, так:
И изменится ли ответ, если сравниваемые величины будут иметь тип double? |
|||
|
||||
zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: нет Всего: 92 |
удалось "взломать" ![]() #define int MyClass и перегрузкой операторов сравнения ![]()
все это в VC7.1, ни одного ворнинга даже не получил ![]() |
||||
|
|||||
Ln78 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
Это немного "нечестно" ![]() |
|||
|
||||
Ln78 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
Уточню, что когдая я говорил про тип double, я имел в виду другую пару функций:
|
|||
|
||||
The Thing |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 286 Регистрация: 6.9.2004 Репутация: нет Всего: 3 |
Я бы ответил, что нет - неизменится! Ноч что-то мне подсказывает, что разница есть! -------------------- Правильность работы программы зависит от двух велечин. В нужном месте должны стоять нолик и еденичка. |
||||
|
|||||
The Thing |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 286 Регистрация: 6.9.2004 Репутация: нет Всего: 3 |
Единственное, double проверять на равно!
![]() -------------------- Правильность работы программы зависит от двух велечин. В нужном месте должны стоять нолик и еденичка. |
|||
|
||||
Ln78 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
||||
|
||||
The Thing |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 286 Регистрация: 6.9.2004 Репутация: нет Всего: 3 |
если это не целые числа, то вряд ли они будут равны!
Этот тип данных чаще всего используется или при снятие каких-то данных с устройств или при больших вычислениях и в том и в другом случае появляется нижепредставленная проблема. 2,499999999999999999876 и 2,499999999999999999877 равны? да вот из -за таких вотслучаев
как думаешь, что выведется? ... вот ето - ":)" -------------------- Правильность работы программы зависит от двух велечин. В нужном месте должны стоять нолик и еденичка. |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 1 Всего: 128 |
В компе всегда происходит потеря точности при операциях с дробными числами, даже двойной точности double. Поэтому и сравнение на равенство не пройдет в большинстве случаев (а мож, и во всех).
|
|||
|
||||
Ln78 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
The Thing, mr.Anderson, вы не совсем правы, особенно в отношении к данной задаче. Вообще, полезно знать, каким образом вещественные числа представляются в машине. Когда мы говорим о вещественных числах, содержащих целое число степеней двойки (возможно, и отрицательных степеней, находящихся в допустимом диапазоне), то эти числа (например, 5.0, 0.75) в машине будут представлены точно, будь то float или double. Тем более, что в данном случае мы говорим о сравнении двух вещественных чисел (как они были получены, это вопрос другой), а это не что иное, как два набора по 64 последовательности нулей и единичек. От того, что мы их в данной операции представляем вещественными числами, они ни с того ни с сего не начнут менять свои значения. Конечно, нужно понимать, что сравнение
строго математически не будет выполнено (хотя приближённое значение константы 0.1 тоже представляется своей последовательностью из 0 и 1, и найдётся такое значение x, которое этому равенству будет удовлетворять), и на практике чаще всего подобные сравнения лучше заменять чем-нибудь вроде
причём eps часто намного больше, чем это вызвано машинной точностью, но и мистифицировать представление вещественных чисел в компьютере тоже не стоит: там всё - нулики и единички, и само по себе оно может меняться также как и целые числа. |
||||
|
|||||
Ln78 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: нет Всего: 15 |
Учитывая, что за прошедшее время ответ не дал никто и то, что приближается Новый год, чтобы меньше нерешённых задач перешло на следующий год, даю ответ сам. Для функций с целыми аргументами результат будет всегда одинаков. Но для аргументов с типом double существуют значения параметров, при которых функции возвращают разные значения. Дело в том, что переменная типа double, может иметь такое значение, которое означается как NaN (not a Number), и, если хотя бы одна из переменных, участвующих в любой операции сравнения, является таким «не числом», результат всегда будет false. Поэтому, например, для:
имеем: d1=1.000000, d2=-1.#QNAN0 i1=1, i2=0 Это сообщение отредактировал(а) Ln78 - 30.12.2007, 07:19 |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Интересные и занимательные задачи по программированию | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |