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


Автор: tishaishii 8.11.2013, 12:07
Помогите упростить выражение:
Код
z := ( ( x / y ) > 2.0 ) or ( ( y / x ) > 2.0 )


Желательно получить формулу, по которой вычисляется "z", где используются только операторы: ">" , "+" , "-" , "/" , "*".

Автор: _Y_ 8.11.2013, 13:04
А что в этом выражении не так? Довол'нo простое. 

В некоторых языках Булевы значения представляются как 1 или 0. Тогда можно, наверное, наворочатъ как-то и избежатъ оператора OR. Но не думаю, что это будет выглядетъ как "упрощение".

Автор: tishaishii 8.11.2013, 13:11
У меня "x" и "y" - это сложные длинные выражения, которые нет возможности записать в переменную.
В формуле не хочется два раза развёрнуто указывать  что такое "x" и "y".

Автор: Akina 8.11.2013, 14:05
Не указывай. Посчитай предварительно и сохрани в переменных.

Автор: tishaishii 8.11.2013, 14:05
Цитата
У меня "x" и "y" - это сложные длинные выражения, которые нет возможности записать в переменную.

Автор: Akina 8.11.2013, 14:09
Уточни, по какой причине "нет возможности записать в переменную". Ибо на каждую хитрую гайку...

Автор: _Y_ 8.11.2013, 14:32
tishaishii, а оператр проверки вхождения в интервал в языке есть? 

Если да, можно сделать что-то типа:

    
z := NOT ( x / y В_ИНТЕРВАЛЕ ОТ 1/2 до 2)

Автор: tishaishii 8.11.2013, 14:56
Отлично!
То, что нужно.

Добавлено через 6 минут
Постой.
Но в это формуле "x" и "y" не равназначны же.
То есть, "y" находится в делителе. Это делает его противостоящим "x".
По-моему, эта формула, чтобы быть равнозначной, должна выглядеть так:
Код
z := NOT ( x / y В_ИНТЕРВАЛЕ ОТ 1/2 до 2) OR NOT ( y / x В_ИНТЕРВАЛЕ ОТ 1/2 до 2) 

А мне хотелось бы избавиться от двойного указания "x" или "y" в формуле.

Автор: _Y_ 8.11.2013, 21:37
tishaishii, а разве моя формула работать не будет? Вроде должна.

Автор: Akina 8.11.2013, 22:36
Цитата(tishaishii @  8.11.2013,  15:56 Найти цитируемый пост)
в это формуле "x" и "y" не равназначны же.

Только в том, что x может быть нулём, а y нет. В остальном - полная эквивалентность.

Автор: _Y_ 9.11.2013, 10:59
Цитата(Akina @  8.11.2013,  22:36 Найти цитируемый пост)
Только в том, что x может быть нулём, а y нет


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

Привык, что деление на ноль дает не ошибку, а плюс или минус бесконечность (есть такие константы в языке, на котором работаю). Соответственно и деление на ноль - вполне законная процедура в данном контексте. Бесконечность выйдет за интервал и даст z==TRUE.

Автор: tishaishii 10.11.2013, 11:00
Спасибо.

Автор: ТарасАтавин 30.11.2013, 20:05
Цитата(tishaishii @  8.11.2013,  13:11 Найти цитируемый пост)
которые нет возможности записать в переменную.
Тип не можешь вывести, или оператор присваивания забыл?

Добавлено через 2 минуты и 7 секунд
Цитата(_Y_ @  9.11.2013,  10:59 Найти цитируемый пост)
Привык, что деление на ноль дает не ошибку, а плюс или минус бесконечность (есть такие константы в языке, на котором работаю). Соответственно и деление на ноль - вполне законная процедура в данном контексте. 
А ноля на ноль?

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