Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Избежать Булевой алгебры


Автор: _Y_ 27.9.2014, 13:46
Возникла такая нетривиальная задача. Надо написать формулу, не применяя Булевых операторов - только арифметика/алгебра.

Имеются две величины а и b. Надо написать математическую функцию f(a,b), растущую с ростом каждой величины, как, например a+b или sqrt(a*a+b*b), но принимающую значение ноль в случаях если a или b или оба они отрицательны. При этом булевы условия задавать нельзя.

Автор: Pavia 27.9.2014, 14:31
(1+a/abs(a))*(1+b/abs(b))

Автор: _Y_ 27.9.2014, 16:30
Pavia, спасибо. Это, почти решает задачу. Но есть одна проблема.

Если один из аргументов принимает значение ноль возникает неопределенность. А вот неопределенности мне необходимо избегать.

Автор: Pavia 27.9.2014, 16:40
_Y_
sign() -можно использовать?
CrossProduct использовать можно? 

Автор: _Y_ 27.9.2014, 16:46
Цитата(Pavia @  27.9.2014,  16:40 Найти цитируемый пост)
sign() -можно использовать?
CrossProduct использовать можно?  

По-моему sign() это функция просто прячущая внутри себя операторы сравнения. Так что использовать ее нельзя.

С CrossProduct я как-то не сталкивался (ну или не помню). Инет говорит о векторах и трехмерном пространстве. Даже и не знаю каким концом (в трехмерном пространстве) эта функция сюда подходит.

Автор: Dremuk 27.9.2014, 22:04
(1+a/abs(a))*(1+b/abs(b)) - не является растущей. Это набор констант

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Izbezhat-Bulevoy-algebry-id542695e4ae20153c1e8b4567#findElement_E7045_54270a23ae201568632d0b08_0

Автор: Dremuk 27.9.2014, 22:05
0 или 2

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Izbezhat-Bulevoy-algebry-id542695e4ae20153c1e8b4567#findElement_E7045_54270a6fae2015cb6c2d0968_0

Автор: Dremuk 27.9.2014, 22:05
вернее не 2 а 4

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Izbezhat-Bulevoy-algebry-id542695e4ae20153c1e8b4567#findElement_E7045_54270a7dae2015676a2d09ed_0

Автор: Dremuk 27.9.2014, 22:06
по-моему таких функций нет

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Izbezhat-Bulevoy-algebry-id542695e4ae20153c1e8b4567#findElement_E7045_54270abfae2015b5552d0e73_0

Автор: _Y_ 28.9.2014, 11:15
Цитата(Dremuk @  27.9.2014,  22:04 Найти цитируемый пост)
(1+a/abs(a))*(1+b/abs(b)) - не является растущей. Это набор констант



Но, если бы не деление на ноль при a или b равном нулю, это решало бы проблему. Ведь любую растущую функцию можно умножить на получаемую константу.

Автор: maxim1000 1.10.2014, 10:54
(a+abs(a))*(b+abs(b))

Автор: _Y_ 1.10.2014, 21:28
maxim1000
Цитата(maxim1000 @  1.10.2014,  10:54 Найти цитируемый пост)
(a+abs(a))*(b+abs(b)) 

О! Именно оно. Кстати, еще днем нашел дургой вариант того же:

(a+sqrt(a*a))*(b+sqrt(b*b)) 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)