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

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

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

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

P.S. Разумеется с оптимизацией.
...
Рейтинг: 0 / 0
11.12.2014, 15:15
    #38831487
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто там искал max(a, b) без условных выражений?
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
11.12.2014, 15:38
    #38831526
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто там искал max(a, b) без условных выражений?
petalvik, я вижу что мой голос никто не хочет слышать.

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

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


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

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

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


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

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


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

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

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

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

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

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


я только сейчас увидел, и что вы подразумевали сортировку до меня, и до других не дошло.
Противопоставления по типу либо я идиот либо все остальные делайте в яслях, пожалуйста ;)
...
Рейтинг: 0 / 0
13.12.2014, 13:55
    #38833112
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто там искал max(a, b) без условных выражений?
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
13.12.2014, 16:19
    #38833150
Вася Уткин
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто там искал max(a, b) без условных выражений?
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
13.12.2014, 18:00
    #38833183
JeStone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто там искал max(a, b) без условных выражений?
Реализация для 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
13.12.2014, 18:28
    #38833193
JeStone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто там искал max(a, b) без условных выражений?
Правда тут веселье будет на равных числах ))
...
Рейтинг: 0 / 0
13.12.2014, 18:49
    #38833200
JeStone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто там искал max(a, b) без условных выражений?
Для 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
13.12.2014, 20:38
    #38833239
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто там искал max(a, b) без условных выражений?
зачётная формула
я так понимаю тут дело в производительности (особенно,наверное, на видеокартах) - штраф за переходы не идёт
тестил на i5 в fpc, процентов на 20 быстрее чем классическая перестановка со сравнением
...
Рейтинг: 0 / 0
13.12.2014, 23:38
    #38833294
Вася Уткин
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто там искал max(a, b) без условных выражений?
kealon(Ruslan)зачётная формула
я так понимаю тут дело в производительности (особенно,наверное, на видеокартах) - штраф за переходы не идёт
тестил на i5 в fpc, процентов на 20 быстрее чем классическая перестановка со сравнением
Куда "не идёт" "штраф за переходы" "на видеокартах"?
...
Рейтинг: 0 / 0
14.12.2014, 08:05
    #38833320
JeStone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто там искал max(a, b) без условных выражений?
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
14.12.2014, 19:11
    #38833571
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто там искал max(a, b) без условных выражений?
Вася Уткин,
современные процы пытаются просчитать заранее куда пойдёт ваш код, если он ошибается - "штраф" (время больше, в видеокартах ещё хуже с условными переходами)
в этом коде условных переходов нет
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Кто там искал max(a, b) без условных выражений? / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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