Попадание в диапазон
От: 777777w  
Дата: 11.07.08 11:05
Оценка:
Можно ли как-то более эффективно записать выражение

    if(MarkH[0]-20 < Depth && Depth < MarkH[0]+20)
        {
        ...
        }

Компилятор генерирует больно уж длинный код
Re: Попадание в диапазон
От: Сергей Мухин Россия  
Дата: 11.07.08 11:10
Оценка:
Здравствуйте, 777777w, Вы писали:

7>Можно ли как-то более эффективно записать выражение


7>
7>    if(MarkH[0]-20 < Depth && Depth < MarkH[0]+20)
7>        {
7>        ...
7>        }
7>

7>Компилятор генерирует больно уж длинный код

версия компилятора?
опции компилятора?
с генеренный код?
---
С уважением,
Сергей Мухин
Re: Попадание в диапазон
От: jazzer Россия Skype: enerjazzer
Дата: 11.07.08 11:16
Оценка: 1 (1)
Здравствуйте, 777777w, Вы писали:

7>Можно ли как-то более эффективно записать выражение


7>
7>    if(MarkH[0]-20 < Depth && Depth < MarkH[0]+20)
7>        {
7>        ...
7>        }
7>

7>Компилятор генерирует больно уж длинный код

судя по тому, что у тебя написано, условие эквивалентно
if ( abs( Depth - MarkH[0] ) < 20 )

ы?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Попадание в диапазон
От: 777777w  
Дата: 11.07.08 11:16
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>версия компилятора?

СМ>опции компилятора?
СМ>с генеренный код?

Компилятор gcc для микроконтроллера AVR, если интересно. Я-то думал, может есть какие-то предложения "в общем виде". Т.е. более эффективное выражение для определения попадания переменной d в диапазон (m — cost)...(m + const)
Re[2]: Попадание в диапазон
От: Сергей Мухин Россия  
Дата: 11.07.08 11:20
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, 777777w, Вы писали:


7>>Можно ли как-то более эффективно записать выражение


7>>
7>>    if(MarkH[0]-20 < Depth && Depth < MarkH[0]+20)
7>>        {
7>>        ...
7>>        }
7>>

7>>Компилятор генерирует больно уж длинный код

J>судя по тому, что у тебя написано, условие эквивалентно

J>
J>if ( abs( Depth - MarkH[0] ) < 20 )
J>

J>ы?

НЕТ!

например может быть перекрыта [] или тут возможно переполнение на — или даже на abs. или наоборот отсутсвовать переполнение на +-20.
---
С уважением,
Сергей Мухин
Re: Попадание в диапазон
От: Pavel Dvorkin Россия  
Дата: 11.07.08 11:22
Оценка:
Здравствуйте, 777777w, Вы писали:

7>Можно ли как-то более эффективно записать выражение


7>
7>    if(MarkH[0]-20 < Depth && Depth < MarkH[0]+20)
7>        {
7>        ...
7>        }
7>

7>Компилятор генерирует больно уж длинный код

Вообще-то я не понял, что тут длинное

Release



    if(MarkH[0]-20 < Depth && Depth < MarkH[0]+20)
0040102B  lea         eax,[ecx-14h] // умница! - Dvorkin P.
0040102E  test        eax,eax 
00401030  jge         wmain+4Bh (40104Bh) 
00401032  mov         ecx,14h 

    return 0;
00401037  xor         eax,eax 
00401039  test        ecx,ecx 
0040103B  jle         wmain+4Dh (40104Dh) 
        t = 1; // это я добавил
0040103D  mov         dword ptr [t (403374h)],1 
}
00401047  add         esp,28h 
0040104A  ret


Так что лучше ему не помогать. У нег хватило ума твою константу 20 в lea засунуть
With best regards
Pavel Dvorkin
Re[3]: Попадание в диапазон
От: jazzer Россия Skype: enerjazzer
Дата: 11.07.08 11:23
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, jazzer, Вы писали:


J>>Здравствуйте, 777777w, Вы писали:


7>>>Можно ли как-то более эффективно записать выражение


7>>>
7>>>    if(MarkH[0]-20 < Depth && Depth < MarkH[0]+20)
7>>>        {
7>>>        ...
7>>>        }
7>>>

7>>>Компилятор генерирует больно уж длинный код

J>>судя по тому, что у тебя написано, условие эквивалентно

J>>
J>>if ( abs( Depth - MarkH[0] ) < 20 )
J>>

J>>ы?

СМ>НЕТ!


СМ>например может быть перекрыта [] или тут возможно переполнение на — или даже на abs. или наоборот отсутсвовать переполнение на +-20.


а в чем прблема, если она перекрыта корректно (т.е. если она дает одно и то же для одного и того же аргумента)?

А типа MarkH[0]+20 от переполнения гарантировано?

Имхо, если мы боимся переполнения (т.е. ожидаем соответствующие данные, то и надо выбирать типы, с которыми переполнения не будет, например, разрядность увеличить или вообще в double перейти).
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Попадание в диапазон
От: Pavel Dvorkin Россия  
Дата: 11.07.08 11:23
Оценка:
Сорри, я не знал, что у тебя микроконтроллер.
With best regards
Pavel Dvorkin
Re[3]: Попадание в диапазон
От: Pavel Dvorkin Россия  
Дата: 11.07.08 11:24
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>НЕТ!


СМ>например может быть перекрыта [] или тут возможно переполнение на — или даже на abs. или наоборот отсутсвовать переполнение на +-20.


Скорее всего это все экзотика, но, конечно, только автор может решить, так это или нет.
With best regards
Pavel Dvorkin
Re[4]: Попадание в диапазон
От: Сергей Мухин Россия  
Дата: 11.07.08 11:26
Оценка:
Здравствуйте, jazzer, Вы писали:


СМ>>например может быть перекрыта [] или тут возможно переполнение на — или даже на abs. или наоборот отсутсвовать переполнение на +-20.


J>а в чем прблема, если она перекрыта корректно (т.е. если она дает одно и то же для одного и того же аргумента)?


это твое предположение, а еще мб побочный эффект

J>А типа MarkH[0]+20 от переполнения гарантировано?


нет конечно, но это будет другое переполнение! При других значениях! т.е. программа другая

J>Имхо, если мы боимся переполнения (т.е. ожидаем соответствующие данные, то и надо выбирать типы, с которыми переполнения не будет, например, разрядность увеличить или вообще в double перейти).


вот я и говорю, надо _полный_п пример приводить. с типами хотя бы.
---
С уважением,
Сергей Мухин
Re: Попадание в диапазон
От: Сергей Мухин Россия  
Дата: 11.07.08 11:32
Оценка:
Здравствуйте, 777777w, Вы писали:

7>Можно ли как-то более эффективно записать выражение


7>
7>    if(MarkH[0]-20 < Depth && Depth < MarkH[0]+20)
7>        {
7>        ...
7>        }
7>

7>Компилятор генерирует больно уж длинный код


наверно можно сократить одну операцию, хранить не Depth а Depth+20 или соотв Markh

if(MarkH[0] < Depth && Depth < MarkH[0]+40)
---
С уважением,
Сергей Мухин
Re[5]: Попадание в диапазон
От: jazzer Россия Skype: enerjazzer
Дата: 11.07.08 11:33
Оценка: 1 (1) +1
Здравствуйте, Сергей Мухин, Вы писали:


СМ>это твое предположение, а еще мб побочный эффект


ага, а еще операторы < и && тоже переопределены и форматируют винчестер.

про переполнения и побочные эффекты — это тоже твое предположение.

Давай нам лучше автор вопроса про все это расскажет — есть у него переполнения или нет, есть побочные эффекты или нет.
А без этого — я предпочитаю пользоваться бритвой Оккама и предлагать и предполагать простейшее, а не тратить время на обсуждение сферопереполнений.
А если мои предположения неверны — так автор вопроса об этом и скажет.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Попадание в диапазон
От: 777777w  
Дата: 11.07.08 11:36
Оценка:
Здравствуйте, jazzer, Вы писали:

J>судя по тому, что у тебя написано, условие эквивалентно

J>
J>if ( abs( Depth - MarkH[0] ) < 20 )
J>

J>ы?

Боялся что для этого тупо вызовется библиотечная функция, но ради смеха попробовал — оказалось нет, компилятор понимает abs сам и генерирует на него довольно хитрый код, почти на 50 байт короче.
Re[3]: Попадание в диапазон
От: jazzer Россия Skype: enerjazzer
Дата: 11.07.08 11:37
Оценка:
Здравствуйте, 777777w, Вы писали:

7>Здравствуйте, jazzer, Вы писали:


J>>судя по тому, что у тебя написано, условие эквивалентно

J>>
J>>if ( abs( Depth - MarkH[0] ) < 20 )
J>>

J>>ы?

7>Боялся что для этого тупо вызовется библиотечная функция, но ради смеха попробовал — оказалось нет, компилятор понимает abs сам и генерирует на него довольно хитрый код, почти на 50 байт короче.


да вроде абс должен тупо обнулить знаковый бит, и все, если у тебя знаковый тип, естественно.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Попадание в диапазон
От: 777777w  
Дата: 11.07.08 11:46
Оценка:
Здравствуйте, jazzer, Вы писали:

J>да вроде абс должен тупо обнулить знаковый бит, и все, если у тебя знаковый тип, естественно.


В дополнительном-то коде? Обнулить знаковый бит?
Re[5]: Попадание в диапазон
От: jazzer Россия Skype: enerjazzer
Дата: 11.07.08 11:47
Оценка: :)
Здравствуйте, 777777w, Вы писали:

7>Здравствуйте, jazzer, Вы писали:


J>>да вроде абс должен тупо обнулить знаковый бит, и все, если у тебя знаковый тип, естественно.


7> В дополнительном-то коде? Обнулить знаковый бит?


в дополнительном, конечно, небольшой гемор.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Попадание в диапазон
От: gear nuke  
Дата: 11.07.08 11:52
Оценка:
Здравствуйте, 777777w, Вы писали:

7>Компилятор генерирует больно уж длинный код


Показал бы код, возможно туда попало что-то из обрамляющих конструкций.

Вариант с abs
Автор: jazzer
Дата: 11.07.08
я бы не рассматривал — это, скорее всего, дорогая операция. Соль там в другом, если выполнение MarkH[0] дорого — разумно вызывать один раз.

Далее, ты сам сказал компилятору использовать ленивые вычисления — если у проца есть предсказатель, получим промахи в 50% случаев.

Поэтому можно попробовать:
const int h = MarkH[0];
if ( (h - 20 - Depth) // форсируем знаковый бит, если MarkH[0]-20 < Depth
   & (Depth - h - 20) // аккумулируем со знаковым битом 2го условия
   & (1 << sizeof(int) * CHAR_BIT - 1) ) // пробуем оптимизировать < 0
{
}

Осталось разобраться с ошибками и кросплатформенностью
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: Попадание в диапазон
От: Кодт Россия  
Дата: 11.07.08 13:54
Оценка:
Здравствуйте, 777777w, Вы писали:

7>Компилятор gcc для микроконтроллера AVR, если интересно.


Возможно, что у него с оптимизацией в этом месте возникли проблемы.
Например, если Depth и/или MarkH — volatile, то компилятор не может (может не?) взять их значения один раз.

Инлайновая функция тебя спасёт
inline bool in_vicinity(int x, int x0, int d)
{
    // так
    return x0-d < x && x < x0+d;

    // или так
    return abs(x-x0) < d;
}

.....

if(in_vicinity(Depth, MarkH[0], 20))
    .....

Какой вариант быстрее и короче — посмотри сам.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: Попадание в диапазон
От: SergeCpp Россия http://zoozahita.ru
Дата: 11.07.08 14:33
Оценка: 6 (2)
если а < в, то а < х < в = х — а — 1 < в — а — 1
второе сравнение беззнаковое, это доказано в книжке Уоррена — алгорит. трюки. стр.64
пишу с телефона, кратко
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[6]: Попадание в диапазон
От: merk Россия  
Дата: 11.07.08 14:43
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, 777777w, Вы писали:


7>>Здравствуйте, jazzer, Вы писали:


J>>>да вроде абс должен тупо обнулить знаковый бит, и все, если у тебя знаковый тип, естественно.


7>> В дополнительном-то коде? Обнулить знаковый бит?


J>в дополнительном, конечно, небольшой гемор.


вы видели когда-нить -1 в машинном представлении???
все единицы. если скинуть знаковый бит будет maxInt.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.