quick quiz
Nov. 16th, 2009 12:51 amвнимание, вопрос!
в каком случае сравнение if(value!=value) { throw new Exception("..."); } имеет смысл, и что скорее всего написано в том эксепшене? )
(случай реализации кастомного типа, который неправильно сравнивается - здесь не рассматривается)
Комменты скринятся.
UPD:
aruslan подумал абсолютно правильно, как человек, который видел такое в каком-то рендере (i suppose),
kodt_rsdn отжог с 5 случаями, из которых я при написании поста знал только 4 (# как-то в голову не пришло). кстати, на второй случай я натыкался, даже без модификатора. Подожду еще несколько комментаторов и расскриню.
Ну и еще: kodt_rsdn> проведи конкурс на самый банальный и небанальный вариант.
UPD2: в общем, я думаю, что все кто хотел - уже ответили, посему расскриниваю. Самым банальным вариантом остается, как я и думал, фрагмент IEEE754 про сравнение NaN != NaN, a самым неожиданным (для меня) - #define value rand() (надо меньше доверять людям, что ли? :))
И еще, мне все так же остается загадкой, что подразумевал
aruslan под "тривиальным bool и может быть enum".
Спасибо всем за ответы! :) // mr_aleph, твой коммент расскринивать?
no subject
Date: 2009-11-16 12:23 am (UTC)Итак:
- особое значение некастомного типа, которое таки неправильно сравнивается: float/double NaN
- волатильные данные - volatile int value - ловим момент вмешательства извне
- геттер - int value { get {.....} } - даже если мы говорим за С++, в диалекте от MSVC оно доступно; про шарп вообще молчу
- - смысл такой: какого чёрта геттер вернул разные значения? (например, при юнит-тестировании)
- - если этот геттер задуман как нечто с побочными эффектами (например, последовательное чтение из файла), данное условие проверяет неравенство смежных элементов
- wish you happy debug: #define value rand() или любое другое выражение с побочными эффектами
Достаточно?
Кстати, проведи конкурс на самый банальный и самый небанальный вариант.
no subject
Date: 2009-11-16 02:06 pm (UTC)no subject
Date: 2009-11-16 02:26 pm (UTC)no subject
Date: 2009-11-16 02:28 pm (UTC)no subject
Date: 2009-11-16 02:39 pm (UTC)Если это floating point, какая разница, v!=v, или v!=w?
Это вопрос намордника, не NaNов.
no subject
Date: 2009-11-16 02:41 pm (UTC)no subject
Date: 2009-11-16 02:45 pm (UTC)no subject
Date: 2009-11-16 02:49 pm (UTC)Вон можно на 0 проверить, для того чтобы не делить лишний раз на него: foo == 0. И ничё, никаких эпсилонов не надо придумывать.
no subject
Date: 2009-11-16 02:54 pm (UTC)no subject
Date: 2009-11-16 02:45 pm (UTC)Сравнимость выражений - вопрос намордника и оптимизатора.
Странно слышать, что это - миф.
no subject
Date: 2009-11-16 02:50 pm (UTC)no subject
Date: 2009-11-16 03:10 pm (UTC)Могу себе представить неустойчивые методы, где проблему замазывают эпсилонами, видимо k-порядка.
Я про прозаический спиллинг и прочие не вполне эффективно выразимые в типах проблемы.
no subject
Date: 2009-11-16 12:33 am (UTC)no subject
Date: 2009-11-16 01:38 am (UTC)Работает не всегда, но зато выглядит круто.
no subject
Date: 2009-11-16 03:41 am (UTC)Интересно посмотреть на нетривиальные варианты.
Могу представить тривиальные bool и #define, ну может быть enum.
Нетривиальных практических примеров представить не могу, через это и интересно.
no subject
Date: 2009-11-16 02:46 pm (UTC)no subject
Date: 2009-11-16 03:43 am (UTC)no subject
Date: 2009-11-16 05:05 am (UTC)no subject
Date: 2009-11-16 05:23 am (UTC)no subject
Date: 2009-11-16 06:31 am (UTC)а в эксепшне что-то типа MessageBox(0, "Опаньки!", "Деление нуля мимо нуля!");
no subject
Date: 2009-11-16 06:50 am (UTC)а еще 4 случая представить не могу
no subject
Date: 2009-11-16 06:57 am (UTC)no subject
Date: 2009-11-16 07:59 am (UTC)Мне что-то в голову не лезет кроме того самого кастомного сравнения :)
А вообще - так писать надо запретить :)
no subject
Date: 2009-11-16 08:55 am (UTC)Пытался думать про какие нибудь ещё синронизации параллельнов процесовв, но именно в таком варианте, когда ловятся непересекающиеся пары чтений подряд ничего не придумалось.
no subject
Date: 2009-11-16 09:01 am (UTC)#include <stdio.h> int i = 0x7fffffff; volatile float f = *(float*)&i; int main() { if (f != f) printf ("hello, world\n"); }no subject
Date: 2009-11-16 12:04 pm (UTC)а вообще у меня только одна версия - эту переменную кто-то меняет в другом потоке, и этот эксепшн как-то отлавливает такую ситуацию