powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Кто там искал max(a, b) без условных выражений?
27 сообщений из 27, показаны все 2 страниц
Кто там искал max(a, b) без условных выражений?
    #38830779
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
mask = ((b - a) & ((b - a) >> 31));
a += mask;
b -= mask;
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38830785
Васу Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
scf
Код: plaintext
1.
2.
3.
mask = ((b - a) & ((b - a) >> 31));
a += mask;
b -= mask;

Приведите лучше полный пример, на любом удобном языке :)
http://ideone.com/
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38830915
Фотография FishHook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Васу Уткинна любом удобном языке

Код: python
1.
2.
def max(a, b):
    return (b, a)[a > b]
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38831348
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scf,

давай max(a, b, c), хвастун.

P.S. Разумеется с оптимизацией.
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38831487
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonдавай max(a, b, c)
Код: c#
1.
2.
var arr = new int[] { 3, 5, 4 };
var res = arr.Max();


Что там внутри - не колышет.

mayton с оптимизацией.
Код: c#
1.
var res2 = arr.AsParallel().Max();


Распараллеливаем - оптимизация же!

PS: C#, LINQ.
PPS: знаю, что не оптимально, на правах шутки.
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38831526
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvik, я вижу что мой голос никто не хочет слышать.

А в таком кейсе ничего не изменится?

Код: javascript
1.
var arr = new int[] { Integer.MAX_VALUE, 5, 4, .................................... };
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38831605
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scf
Код: plaintext
1.
2.
3.
mask = ((b - a) & ((b - a) >> 31));
a += mask;
b -= mask;


Тут вобщем-то фейл. Не знаю как и где он тестировался но на Java не взлетает.
С обоими вариантами ">>" signed/unsigned не взлетает.
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38831622
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scf
Код: plaintext
1.
2.
3.
mask = ((b - a) & ((b - a) >> 31));
a += mask;
b -= mask;

Хрень это какая-то: если значения 32-битные, то при четном значении (b - a) всегда mask = 0
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38831627
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FishHookВасу Уткинна любом удобном языке

Код: python
1.
2.
def max(a, b):
    return (b, a)[a > b]


Имелось ввиду, чтобы не гадать какой язык и какие типы, а можно было кликнуть и сразу увидеть результат: http://ideone.com/6e17FL
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38832037
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonдавай max(a, b, c), хвастун.
max(a, b, c) = max(a, max(b, c))
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38832159
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tscf
Код: plaintext
1.
2.
3.
mask = ((b - a) & ((b - a) >> 31));
a += mask;
b -= mask;

Хрень это какая-то: если значения 32-битные, то при четном значении (b - a) всегда mask = 0


и мы помним что бывает при знаковом сдвиге вправо. Марк рано похвалил товарища.
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38832165
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

хотя тут я не до конца прав(с точки зрения причинно-следственных связей). Тем не менее, формула выше не должна работать
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38832172
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаю комментарии...
думаю, может это все-таки я идиот, а не все остальные?
http://ideone.com/6W0kWO
А оказалось, что все-таки я не идиот.

Стадное чувство - страшная штука.
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38832180
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryи мы помним что бывает при знаковом сдвиге вправо.
Точно, опять забыл что он знаковый ))
Извиняюсь, неправ.
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38832229
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SashaMercurySashaMercury,

хотя тут я не до конца прав(с точки зрения причинно-следственных связей). Тем не менее, формула выше не должна работать
Не должна, а работает :)
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38833076
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scfЧитаю комментарии...
думаю, может это все-таки я идиот, а не все остальные?
http://ideone.com/6W0kWO
А оказалось, что все-таки я не идиот.

Стадное чувство - страшная штука.

не надо ляля. Эту строчку
Код: plaintext
1.
cout << a << ", " << b << endl;


я только сейчас увидел, и что вы подразумевали сортировку до меня, и до других не дошло.
Противопоставления по типу либо я идиот либо все остальные делайте в яслях, пожалуйста ;)
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38833112
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Хрень это какая-то: если значения 32-битные, то при четном значении (b - a) всегда mask = 0


и мы помним что бывает при знаковом сдвиге вправо. Марк рано похвалил товарища.[/quot]

Ну по стандарту результат сдвига вправо отрицательного числа зависит от реализации. Может быть и беззнаковым.

The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed
type and a non-negative value, the value of the result is the integral part of the quotient of E1/2 E2 . If E1
has a signed type and a negative value, the resulting value is implementation-defined.
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38833150
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BarloneSashaMercuryDima TХрень это какая-то: если значения 32-битные, то при четном значении (b - a) всегда mask = 0


и мы помним что бывает при знаковом сдвиге вправо. Марк рано похвалил товарища.

Ну по стандарту результат сдвига вправо отрицательного числа зависит от реализации. Может быть и беззнаковым.

The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed
type and a non-negative value, the value of the result is the integral part of the quotient of E1/2 E2 . If E1
has a signed type and a negative value, the resulting value is implementation-defined.

Т.е. исходя из "If E1 has a signed type and a negative value, the resulting value is implementation-defined.", приведенный выше пример будет работать implementation-defined, т.е. где-то правильно, а где то нет?
scfЧитаю комментарии...
думаю, может это все-таки я идиот, а не все остальные?
http://ideone.com/6W0kWO
А оказалось, что все-таки я не идиот.

Стадное чувство - страшная штука.

авторint A = 1;
int B;
B = A << -3; // undefined behavior
B = A << 100; // undefined behavior
B = -1 << 5; // undefined behavior
B = -1 >> 5; // unspecified behavior
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38833183
JeStone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Реализация для 32-битных знаковых
Код: c#
1.
2.
3.
4.
5.
6.
        
Int32 Max(Int32 a, Int32 b)
{
    Int32[] ab = new Int32[] { a, b };
    return ab[(Int32)(((double)((Int64)b - a) / (((Int64)(b - a)) * (b - a))) + 1)];
}
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38833193
JeStone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правда тут веселье будет на равных числах ))
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38833200
JeStone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для JavaScript задачу гораздо проще решить, чем для C#
Код: javascript
1.
2.
3.
4.
5.
6.
var a = -3;
var b = -10;
var arr = [];
arr[a-b] = a;
arr[b-a] = b;
var max = arr[arr.length-1];
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38833239
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачётная формула
я так понимаю тут дело в производительности (особенно,наверное, на видеокартах) - штраф за переходы не идёт
тестил на i5 в fpc, процентов на 20 быстрее чем классическая перестановка со сравнением
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38833294
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)зачётная формула
я так понимаю тут дело в производительности (особенно,наверное, на видеокартах) - штраф за переходы не идёт
тестил на i5 в fpc, процентов на 20 быстрее чем классическая перестановка со сравнением
Куда "не идёт" "штраф за переходы" "на видеокартах"?
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38833320
JeStone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JeStoneРеализация для 32-битных знаковых
Код: c#
1.
2.
3.
4.
5.
6.
        
Int32 Max(Int32 a, Int32 b)
{
    Int32[] ab = new Int32[] { a, b };
    return ab[(Int32)(((double)((Int64)b - a) / (((Int64)(b - a)) * (b - a))) + 1)];
}


Вот так вот можно решить проблему одинаковых чисел.
Код: c#
1.
2.
3.
4.
5.
6.
7.
        Int32 Max(Int32 a, Int32 b)
        {
            Int32[] ab = new Int32[] { a, b };
            Int64 x = ((Int64)b - a);
            Int64 y = (Int64)2 * Int32.MaxValue + 2;
            return ab[(Int32)((double)x / y + 1)];
        }
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38833571
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин,
современные процы пытаются просчитать заранее куда пойдёт ваш код, если он ошибается - "штраф" (время больше, в видеокартах ещё хуже с условными переходами)
в этом коде условных переходов нет
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38833581
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вася Уткинkealon(Ruslan)зачётная формула
я так понимаю тут дело в производительности (особенно,наверное, на видеокартах) - штраф за переходы не идёт
тестил на i5 в fpc, процентов на 20 быстрее чем классическая перестановка со сравнением
Куда "не идёт" "штраф за переходы" "на видеокартах"?
kealon(Ruslan)Вася Уткин,
современные процы пытаются просчитать заранее куда пойдёт ваш код, если он ошибается - "штраф" (время больше, в видеокартах ещё хуже с условными переходами)
в этом коде условных переходов нет
Так значит наоборот - на видеокартах идёт штраф за переходы?
...
Рейтинг: 0 / 0
Кто там искал max(a, b) без условных выражений?
    #38833724
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинТак значит наоборот - на видеокартах идёт штраф за переходы?
нет, в этой формуле нет условных переходов и штраф не идёт не на общих процах, не на видяхах
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Кто там искал max(a, b) без условных выражений?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]