· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› Проверка условий при помощи арифметических выражений

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июл 31, 2004 20:05:08

Вот вам небольшое упражнение:

Есть четыре арифметических действия и функции max и min. Причем при выполнении деления на ноль возникает ошибка. Требуется построить выражение, которое даст 1 если x=0 и 0 если x<>0. И еще одно выражение, которое даст 1 если x>=0 и 0 если x<0.


Дата: Июл 31, 2004 20:14:38

Я правильно понимаю "при помощи арифметических" означает логических и арифметических?
Что включает лог\ар операции но исключает jcc, movcc и setcc?
Или логические тоже исключаются?
Арифметические операции с флагом adc sbb - как насчёт них?

И второй вопрос x - знаковый или беззнаковый?


Дата: Июл 31, 2004 20:40:17

Вопрос о беззнаковости снимается - проглядел условия :)


Дата: Июл 31, 2004 22:37:26

The Svin
Под четырьмя арифметическими действиями я имел ввиду сложение, вычитание, умножение и деление. И еще есть функции max и min от произвольного числа аргументов (на случай если кому-то понадобится более чем с двумя аргументами 8). Ну еще можно считать что мы можем строить свои функции из этих базовых операций.

Задача математическая, так что про ассемблер лучше забыть 8)

У меня пока получилось построить только такую функцию:
f(x)=0 x<=0
f(x)=x 0<x<1
f(x)=1 x>=1
Можно конечно подставить x/inf, но это получается приближенное решение да еще совсем не пригодное для вычислений.


Дата: Авг 1, 2004 00:18:32 · Поправил: Valery

Если я чего не перепутал то первый вопрос так:

|x-y| = max(x-y,y-x)
|x| = |x-0|
sg x = max(0,min(1,|x|))
sg'x = 1-sg x


Дата: Авг 1, 2004 00:24:46

Ой извини не просек что числа вещественные. Отменяется, sg не пройдет :((


Дата: Авг 1, 2004 01:34:43

Модули я понял тоже нельзя?
С ними намного проще, или иначе с abs\nabs.
С логикой или\и проверкой условий вообще очень просто и коротко.
Чтобы поддержать топик первое неоптимальное но валидное(из того что я понял) решение
abs=max(x*1,x*(-1))
(x:max(1,abs(x)))-1)*(-1)


Дата: Авг 1, 2004 01:53:19

Не написал для чего, но наверно понятно :)
if x = 0 fun(x)=1
else fun(x)=0
max(x*1 .. написано для наглядности, понятно при вычислении это просто max(x,x*(-1))


Дата: Авг 1, 2004 04:25:13

Что-то мне кажется что такую функцию построить неполучится: функции min и max разрывов имеют не больше чем имеют функции аргументы, а разрыв в функции f(x)=1/x бесконечный и сделать его конечным по моему не получится.
Хотя функция s(x)=x/(max(x,-x)+a) при a->0 становится все более похожей на функцию sign(x), но это опять приближенное решение, к тому же не этой задачи 8(


Дата: Авг 1, 2004 04:28:52 · Поправил: Black_mirror

The Svin
Я забыл в условии написать что числа вещественные.
А для целых чисел решение правильное 8)


Дата: Авг 1, 2004 11:42:12

А почему неподходит для вещественных?
Там только умножение на -1, деление на x/x если x > 0, вычитание 1 из 1 или 0. В чём тут проблема с вещественными? Как операция вызовет проблемы? x/x при x<>0? Это единственная операция ни с нулём и единицей и она даст 1.


Дата: Авг 1, 2004 16:06:53

The Svin
По моему график будет выглядеть так:
___/\___


В формуле не хвататет одной скобки и я думаю что скобка должна быть здесь:
((x:max(1,abs(x)))-1)*(-1)


Дата: Авг 1, 2004 16:07:34

Svin, замечание вероятно адресовано мне.


Дата: Авг 1, 2004 16:14:32

Valery
К Svin'у тоже относится, у него точно такая же функция получается.

А max здесь не нужен:
sg x = max(0,min(1,|x|))


Дата: Авг 1, 2004 18:04:24

„В формуле не хвататет одной скобки и я думаю что скобка должна быть здесь:
((x:max(1,abs(x)))-1)*(-1)“


Да, так должно быть.

По моему график будет
  1
__|__
  0


При x <> 0 x/x будет = 1 и после вычитания 1 - нулю. Умножение на -1 не изменит ничего.
А при x = 0 будет 0:1=0 и -1 после вычитания 1 далее -1*-1=1

Чего я недопонимаю? Тут либо min\max перестаёт работать на каких то пределах при стремлении вещественного (представим как x\y) к нулю
либо если он работает при любом малом x и y в x\y то и умножение на -1 и деление (x:y)\(x:y) не вызывает проблем.
Дихотомия. Т.е. если ты допускаешь min\max при любом x то автоматически допускаешь x\x=1 при любом x <> 0.
Дальше то вообще (при возможном делении x\x при x<>0) происходит работа с единицей и нулём причём без делений.
И численный алгоритм в моей функции другой чем у Валерия - я использую деление.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.151