quick quiz

Nov. 16th, 2009 12:51 am
wizzard: (Default)
[personal profile] wizzard

внимание, вопрос!

в каком случае сравнение if(value!=value) { throw new Exception("..."); } имеет смысл, и что скорее всего написано в том эксепшене? )

(случай реализации кастомного типа, который неправильно сравнивается - здесь не рассматривается)


Комменты скринятся.


UPD: [livejournal.com profile] aruslan подумал абсолютно правильно, как человек, который видел такое в каком-то рендере (i suppose), [livejournal.com profile] kodt_rsdn отжог с 5 случаями, из которых я при написании поста знал только 4 (# как-то в голову не пришло). кстати, на второй случай я натыкался, даже без модификатора. Подожду еще несколько комментаторов и расскриню.


Ну и еще: kodt_rsdn> проведи конкурс на самый банальный и небанальный вариант.


UPD2: в общем, я думаю, что все кто хотел - уже ответили, посему расскриниваю. Самым банальным вариантом остается, как я и думал, фрагмент IEEE754 про сравнение NaN != NaN, a самым неожиданным (для меня) - #define value rand() (надо меньше доверять людям, что ли? :))
И еще, мне все так же остается загадкой, что подразумевал [livejournal.com profile] aruslan под "тривиальным bool и может быть enum".


Спасибо всем за ответы! :) // mr_aleph, твой коммент расскринивать?

Date: 2009-11-16 12:23 am (UTC)
From: [identity profile] kodt-rsdn.livejournal.com
"В каких случаях", ты хочешь сказать?
Итак:
- особое значение некастомного типа, которое таки неправильно сравнивается: float/double NaN
- волатильные данные - volatile int value - ловим момент вмешательства извне
- геттер - int value { get {.....} } - даже если мы говорим за С++, в диалекте от MSVC оно доступно; про шарп вообще молчу
- - смысл такой: какого чёрта геттер вернул разные значения? (например, при юнит-тестировании)
- - если этот геттер задуман как нечто с побочными эффектами (например, последовательное чтение из файла), данное условие проверяет неравенство смежных элементов
- wish you happy debug: #define value rand() или любое другое выражение с побочными эффектами

Достаточно?

Кстати, проведи конкурс на самый банальный и самый небанальный вариант.

Date: 2009-11-16 12:33 am (UTC)
From: [identity profile] kodt-rsdn.livejournal.com
Ах да, забыл ещё один смысл: если мы тестируем компилятор на глючность :)))

Date: 2009-11-16 01:38 am (UTC)
From: [identity profile] aruslan.livejournal.com
Подозреваю, что это такой ебанутый способ написать скалярную или векторную форму IsNAN(x).
Работает не всегда, но зато выглядит круто.

Date: 2009-11-16 03:41 am (UTC)
From: [identity profile] aruslan.livejournal.com
Не в рендере, а в симуляции разбивающегося стекла, и не видел, а писал, и не v!=v, а isNAN :))
Интересно посмотреть на нетривиальные варианты.
Могу представить тривиальные bool и #define, ну может быть enum.
Нетривиальных практических примеров представить не могу, через это и интересно.

Date: 2009-11-16 03:43 am (UTC)
From: [identity profile] aruslan.livejournal.com
Разве что volatile, но это немножко за гранью добра и зла.

Date: 2009-11-16 05:05 am (UTC)
From: [identity profile] gds.livejournal.com
не знаю, про какой язык речь, но "value!=value" может дать истинное значение при сравнении с собой floating point "not a number" значения.

Date: 2009-11-16 05:23 am (UTC)
From: [identity profile] mr-aleph.livejournal.com
кстати в SQL NULL не равен NULL, но это же не SQL =)

Date: 2009-11-16 06:31 am (UTC)
From: [identity profile] nicka-startcev.livejournal.com
Это не-число.
а в эксепшне что-то типа MessageBox(0, "Опаньки!", "Деление нуля мимо нуля!");

Date: 2009-11-16 06:50 am (UTC)
From: [identity profile] zhengxi.livejournal.com
проверка на NaN
а еще 4 случая представить не могу

Date: 2009-11-16 06:57 am (UTC)
From: [identity profile] zeux.livejournal.com
В эксепшене написано "NaN happened, call the programmer - NOW!"

Date: 2009-11-16 07:59 am (UTC)
From: [identity profile] belnetmon.livejournal.com
Обязательно нужно потом опубликовать правильный ответ :)
Мне что-то в голову не лезет кроме того самого кастомного сравнения :)
А вообще - так писать надо запретить :)

Date: 2009-11-16 08:55 am (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
Вспомнил только сравнение на NaN-числа, для float/double

Пытался думать про какие нибудь ещё синронизации параллельнов процесовв, но именно в таком варианте, когда ловятся непересекающиеся пары чтений подряд ничего не придумалось.

Date: 2009-11-16 09:01 am (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
#include <stdio.h>

int i = 0x7fffffff;
volatile float f = *(float*)&i;

int main()
{
    if (f != f)
        printf ("hello, world\n");
}

_Winnie C++ Colorizer

Date: 2009-11-16 12:04 pm (UTC)
From: [identity profile] al-zatv.livejournal.com
думаю, в эксепшне написано "офигеть, такого не может быть":)

а вообще у меня только одна версия - эту переменную кто-то меняет в другом потоке, и этот эксепшн как-то отлавливает такую ситуацию

Date: 2009-11-16 02:06 pm (UTC)
From: [identity profile] zabivator.livejournal.com
И всё варианты - пиздец, пиздец, пиздец, который нельзя использовать.

Date: 2009-11-16 02:26 pm (UTC)
From: [identity profile] aruslan.livejournal.com
NaN-то почему пиздец?

Date: 2009-11-16 02:28 pm (UTC)
From: [identity profile] zabivator.livejournal.com
Гм. Тогда уж это в функции isNaN должно быть как документированный хак... А не где попало в коде.

Date: 2009-11-16 02:39 pm (UTC)
From: [identity profile] aruslan.livejournal.com
Да брось.
Если это floating point, какая разница, v!=v, или v!=w?
Это вопрос намордника, не NaNов.

Date: 2009-11-16 02:41 pm (UTC)
From: [identity profile] lionet.livejournal.com
Мифы о несравнимости floating point чисел не распространяй, плиз.

Date: 2009-11-16 02:45 pm (UTC)
From: [identity profile] aruslan.livejournal.com
Сравнимость чисел - вопрос терминологический и контекста.
Сравнимость выражений - вопрос намордника и оптимизатора.
Странно слышать, что это - миф.

Date: 2009-11-16 02:49 pm (UTC)
From: [identity profile] lionet.livejournal.com
Это не значит, что операция != или == автоматом табу для fp, под одну гребёнку.

Вон можно на 0 проверить, для того чтобы не делить лишний раз на него: foo == 0. И ничё, никаких эпсилонов не надо придумывать.

Date: 2009-11-16 02:50 pm (UTC)
From: [identity profile] lionet.livejournal.com
Я подразумеваю школьные мифы типа: сравнивать напрямую нельзя, только через неравенство и эпсилон.

Date: 2009-11-16 03:10 pm (UTC)
From: [identity profile] aruslan.livejournal.com
А, ну это от контекста зависит, очевидно.
Могу себе представить неустойчивые методы, где проблему замазывают эпсилонами, видимо k-порядка.
Я про прозаический спиллинг и прочие не вполне эффективно выразимые в типах проблемы.

Profile

wizzard: (Default)
wizzard

January 2019

S M T W T F S
  12 345
6789101112
1314 1516171819
202122 23242526
2728293031  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 25th, 2026 06:42 am
Powered by Dreamwidth Studios