igorbor: (Default)
[personal profile] igorbor
Однажды приятель, работающий в Хеврат Хашмаль, прислал мне на работу письмо с заголовком: "Смотри, как в нашей конторе проверяют две переменные на равенство" и кусочком кода на несколько строчек:

if( a > b)
{
/* Do nothing */
}
else if( a < b)
{
/* Do nothing */
}
else
{
блаблабла - тут был написан какой-то реальный код.
}


Я посмеялся в усы и тут же переслал это письмо всем на фирме - только на всякий случай, чтобы не подставлять мужика (кто знает, какие у них там порядки в Хеврат Хашмале), вырезал все его данные и написал только, что вот, мол, этот код - не просто шутка, а кусок живой программы. Пусть, думаю, народ повеселится.

Через три минуты мне пришло ДВА ответа примерно одинакового содержания: "It's not me, it was there before"

Date: 2003-09-04 12:23 pm (UTC)
From: [identity profile] arbat.livejournal.com

I've seen code like this:

if ( commission != 0.0 ) {
price += commission;
}

Date: 2003-09-04 12:48 pm (UTC)
From: [identity profile] vrml.livejournal.com
Насколько я помню есть такой случай - ноль с минусом в знаковом бите, он побитово не равен просто нулю, и только такой конструкцией может сравниваться. Наверно есть и еще варианты когда битовые представления неединственны. Например если тип невстроенный и все операторы перегружены.

Date: 2003-09-04 12:52 pm (UTC)
From: [identity profile] labas.livejournal.com
ну нормально написано, чего
вдруг понадобится срочно что-то сделать для случая a>b
а у них уже все и готово

Date: 2003-09-04 12:55 pm (UTC)
From: [identity profile] abrab.livejournal.com
Смешно :)
Но между нами, девочками, в моих программах такие "заглушки" сплошь и рядом.
Часто работодатель знает, что делать, если a>b, но пока еще совсем не представляет, что делать в других случаях, но на всякий случай нужно поставить "заглушку", потому что через пару дней или недель ему обязательно что-то придумается.

Date: 2003-09-04 01:21 pm (UTC)
From: [identity profile] igorbor.livejournal.com
Ну, это не тот случай. Кроме того, мне представляется, что перегрузить операторы <> и не сделать == ненамного лучше вышеприведенного кода. Хотя это MHO, конечно.

Date: 2003-09-04 01:27 pm (UTC)
From: [identity profile] igorbor.livejournal.com
А может быть, наоборот - раньше был код и для того, и для другого, и для третьего, а потом его потихоньку удаляли, и вот что осталось.

Меня тогда гораздо больше развеселила реакция коллег, если честно.

Date: 2003-09-04 01:48 pm (UTC)
From: [identity profile] cema.livejournal.com
Well, I think you will agree this is more subtle.

Date: 2003-09-04 02:08 pm (UTC)
From: [identity profile] labas.livejournal.com
это я пытался так пошутить, но судя по комментарию ниже, в каждой шутке... :)))

Date: 2003-09-04 02:34 pm (UTC)
From: [identity profile] http://users.livejournal.com/_svetka_/
Тоже из реального кода:
public final static int ETHICAL_VIOLATION_EXCEPTION = 10;
правда прелесть?

Date: 2003-09-04 02:43 pm (UTC)
From: [identity profile] dimrub.livejournal.com
Зря смеетесь. Все правильно написано. На каждый if, должен быть else, а компилятор все равно такие пустые блоки оптимизирует.

Date: 2003-09-04 02:54 pm (UTC)
From: [identity profile] cmm.livejournal.com
ежели иметь дело с плавающей точкой, то так писать вполне даже и разумно.

(дисклямер: я давно не имел дел с плавающей точкой, посему могу и гнать.)

Date: 2003-09-04 03:33 pm (UTC)
From: [identity profile] trurle.livejournal.com
Никак нет. Прелесть плавающей точки в том что она представляет числа приближенно. Поэтому проверка
if (x==sqrt(x*x))
может сработать совсем не так как того ожидает наивный программист.
Но уж если представление отличается от точного, то оно либо меньше, либо больше.
правильно писать
if (fabs(x-sqrt(x*x))
[Error: Irreparable invalid markup ('<eps)>') in entry. Owner must fix manually. Raw contents below.]

Никак нет. Прелесть плавающей точки в том что она представляет числа приближенно. Поэтому проверка
if (x==sqrt(x*x))
может сработать совсем не так как того ожидает наивный программист.
Но уж если представление отличается от точного, то оно либо меньше, либо больше.
правильно писать
if (fabs(x-sqrt(x*x))<EPS)
где EPS - допустимая ошибка.
А код из примера <lj site="livejournal.com" user="igorbor"> решительно ничему не помогает

Date: 2003-09-04 03:52 pm (UTC)
From: [identity profile] cmm.livejournal.com
дык ну?
проверять на равенство "в лоб" в таком случае неразумно, натурально.
но заключать "равно" исходя из того, что "и не меньше, и не больше", по-моему, нормально.
(хотя рисовать пустые if'ы глупо всё равно, конечно же)

Date: 2003-09-04 03:58 pm (UTC)
From: [identity profile] trurle.livejournal.com
но заключать "равно" исходя из того, что "и не меньше, и не больше", по-моему, нормально.
Нет. Положим, sqrt(16) будет не 4, а 3.99999999. Тогда сработает ветка "меньше" - и чего мы добились?

Date: 2003-09-04 04:10 pm (UTC)
From: [identity profile] cmm.livejournal.com
> и чего мы добились?

резонного вывода "чёрт подери, а ведь вычисления с плавающей точкой могут быть неточны!".
я собственно всё к чему?  к тому что логика типа "if a > b stuff else if a < b stuff else stuff" не обязательно избыточна, а не к тому что последняя ветка в ней так уж информативна. :)

(прошу прощения за пустой коммент, ЖЖ глючит)

Date: 2003-09-04 06:05 pm (UTC)
From: [identity profile] igorbor.livejournal.com
Все это верно. Но к конкретному примеру отношения не имеет. Обычные целые числа.

буквально на днях

Date: 2003-09-04 10:34 pm (UTC)
From: [identity profile] mumbra.livejournal.com
я сама над собой потешалась по поводу подобной истории,
у меня было соверешнно дикое и громоздкое условие, при выполнении которого не нужно было ничего делать, а в обратном случае - выводить некий блок на страницу,
в момент написания я была уже настолько заморочена, что противоположное условие в голове у меня уже не выстраивалось, можно конечно было построить его по формальным правилам, но опасаюсь я использовать то, что не помещается в моей голове %)) и я написала это самое - пустой иф и не пустой элз %)))) и тут же кое-кому призналась в содеянном :)) но за общей занятостью, как это обычно бывает, оно живет себе в таком виде до сих пор :)

Date: 2003-09-05 12:45 am (UTC)
From: [identity profile] trurle.livejournal.com
Я [livejournal.com profile] cmm отвечаю.

Date: 2003-09-05 05:01 am (UTC)
From: [identity profile] greenadine.livejournal.com
Ну да, все - результаты безумных copy-paste из других источников. У нас регулярно стоят конструкции
if (!a == false) {
...
}
И никто не решается поправить, потому как "оно же работает!"

Date: 2003-09-05 08:10 am (UTC)
From: [identity profile] cema.livejournal.com


Конечно, и всё же сравнение с нулём особый случай.

Date: 2003-09-05 08:21 am (UTC)
From: [identity profile] trurle.livejournal.com
Не очень понял, честно говоря.
(asin(1)-M_PI/2) может запросто оказаться отличным от 0.

Date: 2003-09-05 06:59 pm (UTC)
From: [identity profile] zhenyach.livejournal.com
Это как раз легко представить зачем могло быть написано.

Например, если в системе, под которую это писалось,
а) плавающие операции дороги;
б) сравнение двух переменных на равенство не есть плавающая операция;
в) commission почти всегда равен нулю

Экономия, конечно, маленькая, но всё ж.

Date: 2003-09-05 07:01 pm (UTC)
From: [identity profile] zhenyach.livejournal.com
Занятно, что результат не зависит от относительных приоритетов операций "==" и "!".

Date: 2003-09-05 07:59 pm (UTC)
From: [identity profile] arbat.livejournal.com

Человек, который пишет финансовую аппликацию в системе, где плавающие операции настолько дороги - полный мудак.

Кроме того, быстродействие компьютеров растет. Можно оптимизировать, а можно - подождать, пока hardware догонит требуемую мощность. Оптимизация уместна, если она может быть сделана за время, меньшее времени требуемого ожидания нового железа. А тут надо было как минимум секунд 5 печатать.

Date: 2003-09-06 06:55 am (UTC)
From: [identity profile] igorbor.livejournal.com
Для того, чтобы оптимизация стала уместна, мало того, чтобы ожидание нового железа было мало. Нужно еще, чтобы выигрыщ от оптимизации был больше затрат на нее. То есть в Вашем примере, если пятисекундное написание кода экономит 1 наносекунду, для окупания этих затрат код должен выполниться соответствующее число миллионов раз. Плюс нужно еще учесть затраты на сопровождение,когда через несколько лет человек будет глазеть в этот код и гадать - то ли это такая хитрая оптимизация, то ли что?

Не все так плохо

Date: 2003-09-06 07:00 am (UTC)
From: [identity profile] igorbor.livejournal.com
На каждый if должен быть else - это из Паскаля, что ли? или из анекдота? "Дорогой, если ты немедленно не не..., то пеняй на себя" "А else?"

Кроме того, довод про компилятор и оптимизацию ни при чем. Компилятор может также построить правильную программу из кода в одну длииииинную строчку, где все переменные имеют имена от a00000 до z99999, но стоимость сопровождения такого кода он, к сожалению, оптимизировать не может :( Код читается людьми, да и пишется для них же :)

Не все так плохо

Date: 2003-09-06 07:07 am (UTC)
From: [identity profile] igorbor.livejournal.com
Да у каждого такие скелеты в шкафу есть, чего там :)

Но в данном случае как раз все просто. Пишете иф, потом берете в скобки и перед скобками ставите ! :)

Date: 2003-09-06 08:34 am (UTC)
From: [identity profile] arbat.livejournal.com

Несомненно, но мне было лень писать очевидное :-)
Про то, что компьютеры делаются все быстрее - как раз часто забывают. Я видал такие проекты, где 2 программиста с зарплатой за 100 целый год оптимизировали огромную библиотеку так, что она стала в среднем - на 30% быстрее. Могли вместо того закупить новые сервера, на которые всегда так жалко тратиться, и за те же бабки, за то же время - разогнаться куда? Именно.

Date: 2003-09-06 09:50 am (UTC)
From: [identity profile] igorbor.livejournal.com
С другой стороны, это еще зависит от количества инсталляций. Мы, например, сейчас бьемся над тем, чтобы имеющееся железо разогнать с 2 мегабит то сколько получится, и каждый процент важен. Потому что надеемся продавать потом десятками тысяч, и хочется сделать железо как можно дешевле. К тому времени железо подешевеет и помощнеет - хорошо, значит, будем давать не 5 мегабит, а 5 с половиной. Хотя, конечно, оптимизируется алгоритм, а не операторы сравнения :)

Date: 2003-09-06 10:14 am (UTC)
From: [identity profile] arbat.livejournal.com

Так о чем мы спорим?
Игорь Борисович, Вы же - интеллигентный человек...

Re: Не все так плохо

Date: 2003-09-06 10:19 am (UTC)
From: [identity profile] arbat.livejournal.com

Эта идея, которую никто не в состоянии усвоить. Писать код - для людей, не для компьютера...

Казалось бы - простая человеческая гордость должна сказать человеку - не оптимизируй операторы, это - ниже твоего достоинства, этим пусть компилятор занимается, он железный. А комментарии и докумeнтация? Из 10 менеджреов 9 сразу скажут, что у нас нету времени писать документацию.

Date: 2003-09-06 10:23 am (UTC)
From: [identity profile] arbat.livejournal.com

Вообще-то мне казажется, что как раз это должно сработать, если плавающие числа удовлетворяют IEEE. Стандарт требует, чтобы определенные операции давали именно как раз - четкое соответствие между аргументами и результатами. Не помню - какие именно операции и функции включены.

Re: Не все так плохо

Date: 2003-09-07 03:06 am (UTC)
From: [identity profile] dimrub.livejournal.com
Это все для начинающих программистов. Начинающему я всерьез скажу, что на каждый if, в котором нет return, должен быть else. Ибо так проще, чем потом выискивать вшей, вызванных implicit assumption, что if выполнен. Разумеется, опытный программист может сам определить, когда else нужен, а когда - нет.

Date: 2023-12-18 04:57 am (UTC)
From: [personal profile] vilsha
Уже достаточно времени прошло, и можно открыть страшную тайну. Это я был тот, который работал в Хеврат Хашмаль, и прислал Игорю этот код. (Правда, Игорь его перевел в С, а в оригинале он был на PL/1). Я там поначалу переделывал код других программистов, и много насмотрелся, как не надо делать.

Profile

igorbor: (Default)
igorbor

November 2022

S M T W T F S
  12345
67891011 12
13141516171819
20212223242526
27282930   

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 27th, 2025 09:56 pm
Powered by Dreamwidth Studios