Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WTF? Magic??? странные грабли с Equals 
:(
    Опции темы
HalkaR
Дата 7.10.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



Partizan, есть предположение, что для D1 метод CanCompareBits возвращает false по причине наличия поля типа int и сравнение ведется не побитиво, а по полям. А в D2 выполняется FastEqualsCheck, который возвращает false. 
PM MAIL   Вверх
Partizan
Дата 7.10.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



ммм...странно..очень странно...каким образом поле типа int может повлиять на возможность побитового сравнения?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
HalkaR
Дата 7.10.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



Копание в инете дало варианта - CanCompareBits не проходит если в структуре есть пропуски, которые забиваются случайными данными. Возможно то как раз тот случай.
PM MAIL   Вверх
HalkaR
Дата 7.10.2008, 15:24 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



PM MAIL   Вверх
Partizan
Дата 7.10.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



мде...вот и ответ на вопрос...

Magic????

- Magic!


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
nikitao
Дата 7.10.2008, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

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



Если я все правельно понял , то получается следующее :
1. В памяти +0 и -0 хранятся по разному , для вещественных типов
2. Разработчики BCL определили Equals для вещественных чисел таким образом , что +0 -0 равные числа. Обоснование этого - для человека это действительно одинаковые числа. В общем то так оно и должно быть.
3. Для типов значений метод Equals без переопределения исходя из каких то своих соображений то выдает результат на основе побитового сравнения обьектов , то сравнивая поля класса.
4. Из-за переопределённого на уровне double Equals метода мы получаем разные результаты при разных способах сравнения обьектов.

Просто разработчики BCL видемо забыли такой вариант рассмотреть. Не знаю , по идее надо куда то писать в M$ с просьбой профиксить.

Интересно все таки на основе чего выбирается метода сравнения валуе типов.....
Кто нибудь проверял это в CLR 1.x. вдруг там подругому....

Это сообщение отредактировал(а) nikitao - 7.10.2008, 19:53


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Partizan
Дата 8.10.2008, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



Проверяли в жабе...в обоих случаях она выдаёт false


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
diadiavova
Дата 9.10.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



А ты добавь в структуру D2 поле типа int, можешь даже не делать с ним ничего, и посмотри результат.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
HalkaR
Дата 9.10.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



diadiavova, собственно в результате никто не сомневается smile
PM MAIL   Вверх
Дрон
Дата 9.10.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Прикольный баг. Надо всё-таки самим определять Equals, а не надеятся на компилятор.

Цитата(Partizan @  7.10.2008,  14:30 Найти цитируемый пост)
кстати разведка доложила, что жаба в обоих случаях возвращает false. 

Извиняюсь, а как такое можно проверить в Java, если там в принципе нет никаких value type?


--------------------
Да. Именно так.
PM   Вверх
Partizan
Дата 9.10.2008, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



Дрон, =) Не знал, не спец по жабе) я ж говорю, разведка доложила)


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
diadiavova
Дата 9.10.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Цитата(HalkaR @  9.10.2008,  18:05 Найти цитируемый пост)
собственно в результате никто не сомневается

Честно говоря всю тему поленился читать, каюсь. 
Выскажу предположение, надеюсь меня за это не побьют.
Когда в структуре числовые поля одного типа, их сравнение ведётся по упрощённому алгоритму, просто сравниваются как double и всё. А если поля разнотипные, то сначала проверяется тип, причём проверка осуществляется по значению. При проверке чисел 0 и -0 они(по значению) типизируются как целочисленные и логика перенаправляется в ту ветвь, где сравниваются целые числа. А при сравнении их как целых результат очевиден. 
Так что, возможно это не ошибка, а просто ради экономии ресурсов упростили.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
source777
Дата 9.10.2008, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

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



Цитата(Дрон @  9.10.2008,  18:36 Найти цитируемый пост)
Надо всё-таки самим определять Equals, а не надеятся на компилятор.
здравая мысль.  smile 
Впрочем это как раз будет следованием .NET Guidelines.. Все сравниваемые пользовательские типы должны иметь собственную реализацию IEquatable<T>.



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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