powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / максимум без if
25 сообщений из 98, страница 2 из 4
максимум без if
    #38812661
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryXDiaBLoпропущено...

Да там и if есть самый настоящий. Но по сабжу я уже ответил
Программа:(max 5 3)
Результат: 5

а вы посмотрите как в Scheme реализована эта функция :)
Хмм, исходники компилятора чтоль поискать? Там это похоже ключевое слово, даже не из библиотек, а основы языка.
...
Рейтинг: 0 / 0
максимум без if
    #38812666
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryа чем это лучше предложенного кода ранее
пропущено...

Тем что я его не заметил выше :)

Только правильно так
Код: sql
1.
2.
3.
4.
int sign(int x)
{
    return (x>>31) | 1;
}



почему так ? ведь у меня после сдвига в младшем разряде будет либо 1, либо 0
...
Рейтинг: 0 / 0
максимум без if
    #38812667
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
    return x>>31;


Ну и битовые сдвиги не перечислены в разрешенных операциях
andreymx+ - * / and or xor
...
Рейтинг: 0 / 0
максимум без if
    #38812672
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercury
Код: plaintext
1.
    return x>>31;



Ну и битовые сдвиги не перечислены в разрешенных операциях
andreymx+ - * / and or xor
А это же не циклический сдвиг? Деление нацело сойдёт тогда.
...
Рейтинг: 0 / 0
максимум без if
    #38812673
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryпочему так ? ведь у меня после сдвига в младшем разряде будет либо 1, либо 0
обычно принято что sign() возвращает +1 для положительных, -1 для отрицательных и 0 для 0.
В данном случае 0 не важен, т.к. нам в итоге надо получить модуль числа, т.е.
Код: plaintext
1.
abs(x) = x * sign(x)
...
Рейтинг: 0 / 0
максимум без if
    #38812674
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoDima Tпропущено...

Ну и битовые сдвиги не перечислены в разрешенных операциях
пропущено...

А это же не циклический сдвиг? Деление нацело сойдёт тогда.
А мля, 31 а не 32...
...
Рейтинг: 0 / 0
максимум без if
    #38812675
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoXDiaBLoпропущено...

А это же не циклический сдвиг? Деление нацело сойдёт тогда.
А мля, 31 а не 32...Впрочем 2 в 31 степени же.
...
Рейтинг: 0 / 0
максимум без if
    #38812679
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoА это же не циклический сдвиг? Деление нацело сойдёт тогда.
Это оказывается сдвиг с учетом знака
http://msdn.microsoft.com/ru-ru/library/vstudio/k2ay192e(v=vs.100).aspx Для заполнения позиций слева используется бит знака значения
Я не знал, если честно.
...
Рейтинг: 0 / 0
максимум без if
    #38812683
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, тогда надо будет результат побитово умножить на 1. Но если уж уходить от побитового сдвига, то нужно использовать ваш вариант
...
Рейтинг: 0 / 0
максимум без if
    #38812690
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TXDiaBLoА это же не циклический сдвиг? Деление нацело сойдёт тогда.
Это оказывается сдвиг с учетом знака
http://msdn.microsoft.com/ru-ru/library/vstudio/k2ay192e(v=vs.100).aspx Для заполнения позиций слева используется бит знака значения
Я не знал, если честно.
Ясно, деление нацело не сойдёт.
...
Рейтинг: 0 / 0
максимум без if
    #38812692
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryDima T, тогда надо будет результат побитово умножить на 1.
не поможет т.к. 0&1 = 0.
Твой сдвиг дает либо 0000 либо 1111, т.е. для положительных надо дополнительно 0000 превратить в 0001, что и делает |1
...
Рейтинг: 0 / 0
максимум без if
    #38812700
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryDima T, тогда надо будет результат побитово умножить на 1.
не поможет т.к. 0&1 = 0.
Твой сдвиг дает либо 0000 либо 1111, т.е. для положительных надо дополнительно 0000 превратить в 0001, что и делает |1

нет, мне это не нужно. Для положительных я буду иметь 0, для отрицательных 1. И дальше такой код
Код: plaintext
1.
2.
int t=sign(a-b);
int res=b*t+a(1-t);
...
Рейтинг: 0 / 0
максимум без if
    #38812721
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги а какова цена вопроса? Что мы хотим?

1) Оптимизировать скорость?

В этом случае нам надо искать Ассемблер для целевой конфигурации и внимательно
смотреть в нём команды, abs(x,y), sgn(x,y) или их более атомарные декомпозиции.
Далее считать такты и делать бенчмарки.

2) Перейти в другой базис?

Актуально для цифровой системотехники. Искать программно-аппаратное решение.
Можно рисовать логическую машину на вентилях AND/OR/NOT и линиях задержки.
Но это-ли спрашивал автор?

3) Перейти в другой ЯП?

Ну тут вроде примеры уже были. Большая часть - самообман. Трудно доказать
ОТСУТСТВИЕ операции IF внтри них.

4) Делать обфускацию и запутывать читателя?

Нечего добавить. Можно сколь угодно усложнять функцию abs вычисляя ее через
числовые ряды и умножения векторов и матриц. Усложнять вообще может
любой дурак.

Вы попробуйте упростить. Вобщем Генри Уоррен тычет вам свою книжку
и тихо ругается сквозь зубы.
...
Рейтинг: 0 / 0
максимум без if
    #38812735
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧто мы хотим?
Фигней позаниматься

Иногда полезно, я вот например узнал что >> для заполнения позиций слева использует бит знака значения.
...
Рейтинг: 0 / 0
максимум без if
    #38812737
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
(define (mymax a b)
  (/ (+ a b
        (abs (- a b))
     ) 2
  )
)
(mymax 5 8)


Осталось придумать как abs без использования if сделать.
...
Рейтинг: 0 / 0
максимум без if
    #38812746
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoОсталось придумать как abs без использования if сделать.
так уже придумано
Яростный Меч(a + b + abs(a-b)) / 2
Dima Tabs(x) = x * sign(x)
Dima T & SashaMercuryint sign(int x)
{
return (x>>31) | 1;
}
...
Рейтинг: 0 / 0
максимум без if
    #38812748
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TXDiaBLoОсталось придумать как abs без использования if сделать.
так уже придумано
Яростный Меч(a + b + abs(a-b)) / 2
Dima Tabs(x) = x * sign(x)
Dima T & SashaMercuryint sign(int x)
{
return (x>>31) | 1;
}
Да, только я пока Scheme не так хорошо знаю, чтобы это реализовать.
...
Рейтинг: 0 / 0
максимум без if
    #38812755
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, сделал :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
(define (myabs x)
  (* x (sgn x))
)
(define (mymax a b)
  (/ (+ a b
        (myabs (- a b))
     ) 2
  )
)
(max 9 -18)
(max 1 3)
(max 8 115)
...
Рейтинг: 0 / 0
максимум без if
    #38812757
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoЛадно, сделал :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
(define (myabs x)
  (* x (sgn x))
)
(define (mymax a b)
  (/ (+ a b
        (myabs (- a b))
     ) 2
  )
)
(mymax 9 -18)
(mymax 1 3)
(mymax 8 115)


Поправил. Результат таков
автор9
3
115
...
Рейтинг: 0 / 0
максимум без if
    #38812762
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoДа, только я пока Scheme не так хорошо знаю, чтобы это реализовать.
могу только подсказать как по правильному операции называются
>> "битовый арифметический сдвиг вправо"
| "побитовое сложение" или "логическое или"

может поможет нагуглить нужное
...
Рейтинг: 0 / 0
максимум без if
    #38812771
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче вот конечная версия:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#lang racket
(define (mysign x)
  (bitwise-ior 1 (arithmetic-shift x -31))
)
(define (myabs x)
  (* x (mysign x))
)
(define (mymax a b)
  (/ (+ a b
        (myabs (- a b))
     ) 2
  )
)
(mymax 9 -18)
(mymax 1 3)
(mymax 8 115)
...
Рейтинг: 0 / 0
максимум без if
    #38812777
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто я взялся дочитать однажды заброшенный мной SICP, поэтому стараюсь при любой возможности практиковаться. Этим и обусловлен выбор языка.
...
Рейтинг: 0 / 0
максимум без if
    #38812930
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoПросто я взялся дочитать однажды заброшенный мной SICP, поэтому стараюсь при любой возможности практиковаться. Этим и обусловлен выбор языка.
+1
Это мега-похвально.

А что такое "racket" ? Я использовал Common Lisp.
...
Рейтинг: 0 / 0
максимум без if
    #38812956
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonXDiaBLoПросто я взялся дочитать однажды заброшенный мной SICP, поэтому стараюсь при любой возможности практиковаться. Этим и обусловлен выбор языка.
+1
Это мега-похвально.

А что такое "racket" ? Я использовал Common Lisp.
В среде DrRacket по умолчанию используется язык Racket, который хоть и отличается от Scheme, но пока всё компилится, я часто забываю указать "#lang scheme" вместо "#lang racket". В общем он похож на Scheme очень, пока ещё я не наткнулся на различия.

И кстати в книге же Scheme используется а не Common Lisp, я предпочёл использовать то что авторы сказали, правда не осилил компиляцию в mit-scheme, поэтому взял DrRacket, который тоже Scheme поддерживает. В нём вполне удобно.
...
Рейтинг: 0 / 0
максимум без if
    #38813221
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всегда удивляло это многообразие (defun ..) (def ..) (define ..).

Кстати Common-Lisp запретил переопределять max, поэтому я сделал maximum.
...
Рейтинг: 0 / 0
25 сообщений из 98, страница 2 из 4
Форумы / Программирование [игнор отключен] [закрыт для гостей] / максимум без if
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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