Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
 Аватар для Hrethgir
421 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,206
Записей в блоге: 176

Нужна функция Sign без проверки условий

09.07.2015, 15:11. Показов 4097. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я пока не нашёл способа, но ищу.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.07.2015, 15:11
Ответы с готовыми решениями:

Вычислить Z=(sign(x)+sign(y))∙sign(x+y), где -функция определения знака числа, принимающая значение 1, если число а- положительное; -1, если число
Вычислить Z=(sign(x)+sign(y))∙sign(x+y), где -функция определения знака числа, принимающая значение 1, если число а- положительное; -1,...

Нужна функция с ветвлением условий
printf("Вам необходимо больше одного саженца?\n"); char choice; scanf("%s", &choice); if (choice == "Да"){ ...

Описать функцию Sign(X) целого типа, возвращающую для вещественного числа X следующие значения и найти значения выражения Sign(A) + Sign(B)
Описать функцию Sign(X) целого типа, возвращающую для вещественного числа X следующие значения: -1, если Х<0; 0,...

40
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
11.07.2015, 17:44
Лучший ответ Сообщение было отмечено castorsky как решение

Решение

Студворк — интернет-сервис помощи студентам
Странная постановка задачи... Что значит "без проверки условий"?
Если под этим термином подразумевается проверка значения и переход в зависимости от результата, а задача стоит в отказе от джампа в качестве оптимизации, в таком случае данную функцию можно написать так:
Delphi
1
2
3
4
function Sign(const a: Integer):ShortInt;
begin
  Result:=Ord(a>0)-Ord(a<0);
end;
эквивалент на ASMе:
Assembler
1
2
3
4
  or    eax, eax
  sets  ah
  setg  al
  sub   al, ah
3
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
11.07.2015, 21:08
Цитата Сообщение от x128 Посмотреть сообщение
эквивалент на ASMе:
И это работает? Можете дать ссылку на ideone?

Добавлено через 14 минут
Я предлагаю такой вариант (4 инструкции, не считая загрузки и выгрузки):
Assembler
1
2
3
4
5
6
    movl    x, %eax      #  x = signum(x);
    addl    %eax, %eax       
    sbbl    %ebx, %ebx
    negl    %eax
    adcl    %ebx, %ebx
    movl    %ebx, x
Добавлено через 1 минуту
http://ideone.com/3TrXQE
Перед тем как запускать, можно кликнуть edit, затем кликнуть input и ввести какое-нибудь число.

Добавлено через 12 минут
eax = eax + eax (при этом carry = 1 для отрицательных eax)
ebx = ebx - ebx - carry == -carry
eax = -eax (при этом carry = 1 для всех eax кроме 0)
ebx = ebx +ebx + carry (-1 + -1 + 1 для отрицательных eax, 0 + 0 + 1 для положительных, 0 + 0 + 0 для нуля)
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
11.07.2015, 23:56
Цитата Сообщение от Shamil1 Посмотреть сообщение
И это работает? Можете дать ссылку на ideone?
Конечно работает. http://ideone.com/6OWFXM
0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
12.07.2015, 00:29
Цитата Сообщение от Shamil1 Посмотреть сообщение
И это работает?
С такими языками где не сильно строгая типизация - конечно.
0
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
12.07.2015, 02:34
Оказывается, там магия в строке:
Pascal
1
function Sign(const a: Integer):ShortInt;
И почему-то у меня вот эта строка даёт другой результат:
Assembler
1
    sub     %al, %ah
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
12.07.2015, 10:48
Цитата Сообщение от Shamil1 Посмотреть сообщение
И почему-то у меня вот эта строка даёт другой результат:
Я плохо знаком с синтаксисом AT&T, но если я не ошибаюсь, порядок операндов должен быть обратным, т.е. "subb %ah, %al".

Code
1
2
3
if eax>0 then al:=1 else al:=0
if eax<0 then ah:=1 else ah:=0
result:=al-ah
т.е. для любого положительного числа al:=1; ah:=0, для нуля al:=0; ah:=0, для отрицательного al:=0; ah:=1
1
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
12.07.2015, 12:29

Не по теме:

Не понимаю зачем вы полезли в ассемблер


Всё просто:
C
1
2
3
4
int
sign (int n) {
  return (n > 0) - (n < 0);
}
и прыжков нет, и задача решена.

Добавлено через 2 минуты
Согласно стандарту языка си сравнения дают результат 0 как ложь или 1 как истина. Других значений быть не может. А вот стандарта паскаля я не знаю.
1
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
12.07.2015, 12:39
Цитата Сообщение от x128 Посмотреть сообщение
если я не ошибаюсь, порядок операндов должен быть обратным
Вроде заработало:
Assembler
1
2
3
4
5
6
7
8
    movl    x, %eax      #  x = signum(x);
    or      %eax, %eax       
    sets    %ah
    setg    %al
    sub     %ah, %al
    cbw
    cwde
    movl    %eax, x
Цитата Сообщение от x128 Посмотреть сообщение
т.е. для любого положительного числа al:=1; ah:=0, для нуля al:=0; ah:=0, для отрицательного al:=0; ah:=1
Это понятно. Магия была в слове shortint, на которое я сначала не обратил внимания. Ну и вообще, весь процесс перемещения значений из переменных в регистры и обратно не очевиден и остаётся за кадром.
0
 Аватар для Hrethgir
421 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,206
Записей в блоге: 176
12.07.2015, 16:42  [ТС]
проверять на 0 надо, потому что на 0 делить нельзя, а математика правил математики не знает.
возвращаясь к выражению, нужно в первую очередь определить x на линейке, для чего производится операция
x+1
и в дальнейшем нужно привести всё это к следующему виду
x=(x+1)/x,
если результат больше входящих данных, то x положительный, если результат меньше входящих данных, то x отрицательный.
но, похоже, это ёмко очень для компьютера. по крайней мере, ёмче обычных сравнений, пусть даже через while
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
12.07.2015, 17:18
Цитата Сообщение от castorsky Посмотреть сообщение
Всё просто:
Капитан очевидность собственной персоной
Вот мой первый ответ с примером реализации "кликать сюда", предлагаю найти 10 отличий.
Цитата Сообщение от castorsky Посмотреть сообщение
Не понимаю зачем вы полезли в ассемблер
ASM был нужен только для того, чтобы подчеркнуть абсурдность вопроса и показать, что проверка условий - это исключительно логика и джамп не является обязательным атрибутом.
Цитата Сообщение от Shamil1 Посмотреть сообщение
Магия была в слове shortint
Тут скорее не магия, а желание сэкономить на спичках. Результат функции ложится в байт и команда setcc принимает только байт. В случае с возвратом двойного слова пришлось бы выполнить еще одну команду "movsx eax, al".
Цитата Сообщение от Hretgir Посмотреть сообщение
ёмче обычных сравнений, пусть даже через while
Использование циклов это вообще за гранью зла, тут и проверка условий с джампами, и плохая читаемость, хуже этого только предложение использовать try/except.
1
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
12.07.2015, 19:51
Цитата Сообщение от x128 Посмотреть сообщение
Капитан очевидность собственной персоной
Вот мой первый ответ с примером реализации "кликать сюда", предлагаю найти 10 отличий.
Если Вы заметили, я отметил Ваш пост как "лучшый ответ", написал то же на си, и написал свои пояснения относительно возможнных проблем.
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
12.07.2015, 20:11
castorsky, не собирался обидеть, просто ответ выглядит как "всё просто, а вы залезли в дебри", вероятно это я торможу...
0
 Аватар для Hrethgir
421 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,206
Записей в блоге: 176
13.07.2015, 17:13  [ТС]
Цитата Сообщение от x128 Посмотреть сообщение
Использование циклов это вообще за гранью зла, тут и проверка условий с джампами
В смысле...? Джампы будут и в обычной проверке условий, не могу представить себе технической разницы для машины, кроме самой структуры кода. Тем более While, просто цикл и всё, не соблюдено условие-обход... с until ни одного лишнего джампа. Не зло, а систематизация.
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
13.07.2015, 18:21
Цитата Сообщение от Hretgir Посмотреть сообщение
В смысле...?
В контексте решения данной задачи.
Цитата Сообщение от Hretgir Посмотреть сообщение
Джампы будут и в обычной проверке условий
Нет! И я наглядно это продемонстрировал.
Цитата Сообщение от Hretgir Посмотреть сообщение
не могу представить себе технической разницы для машины
Проверка условия - это логическая операция, которая устанавливает флаги. Как обрабатывать флаги уже зависит от конкретной задачи, чаще это условный переход, но не всегда.
Пример:
Delphi
1
if a<0 then b:=1 else b:=0;
и
Delphi
1
b:=ord(a<0);
Смысл один, в обоих случаях мы присваиваем переменной 0 или 1 по результату проверки условия, но в первом случае будет переход (джамп), во втором нет.
Цитата Сообщение от Hretgir Посмотреть сообщение
с until ни одного лишнего джампа. Не зло, а систематизация.
Цикл и переход неразлучны и в данном контексте это зло - это как забивать гвозди микроскопом, можно, но не правильно.
0
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
13.07.2015, 19:14
Условный переход принципиально отличается от логической операции. Условный переход означает ветвление "потока" исполнения кода. Процессор не может точно знать заранее, какую ветку кода нужно загрузить, а может только строить догадки. И если он ошибётся и загрузит не ту ветку, то "потеряет" несколько десятков тактов (будет простаивать, пока загружается нужная ветка).

Именно по этой причине придумывались алгоритмы для вычисления функций типа signum, max, abs и т.п. без условных переходов.
0
1964 / 820 / 114
Регистрация: 01.10.2012
Сообщений: 4,782
Записей в блоге: 2
14.07.2015, 11:00
Цитата Сообщение от Shamil1 Посмотреть сообщение
Условный переход принципиально отличается от логической операции. Условный переход означает ветвление "потока" исполнения кода. Процессор не может точно знать заранее, какую ветку кода нужно загрузить, а может только строить догадки. И если он ошибётся и загрузит не ту ветку, то "потеряет" несколько десятков тактов (будет простаивать, пока загружается нужная ветка).
Не процессор а компилятор - он не знает какую ветку поставить вперед. Это решается указаниями likely/unlikely, напр
C++
1
if (likely(a != 0)) ..
Но эффект такой оптимизации достаточно скромен. Т.е. да, при выполнении перехода кеш считанных команд будет утерян и потребуется какое-то доп время, но это не имеет фатальных/ужасных последствий.
0
 Аватар для Hrethgir
421 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,206
Записей в блоге: 176
14.07.2015, 15:00  [ТС]
Да, в общем, компилятор разрабатывали не нубы. Я всё равно программировать буду через циклы, массивы процедур, ну и Sign. Что могу сказать, пусть будет такая проверка условий, но, написание кода в такой манере будет вести меня к накоплению опыта и к систематизации. Условности я откидываю из учёта. Если я хочу создать свою систему и базу знаний (накопление опыта )быстро - я не должен брать в расчёт то, что является условным, так я эффективно достигну цели, а всё что условно - пыль. Пусть в Sign происходит проверка условий, но я не должен брать это в расчёт, пусть будут джампы, но это явление не физическое а архитектурное - значит я не должен это брать в расчёт.
В первую очередь - придерживаться физики, логика - это фаза физических процессов, и работает она, как ни крути, в рамках законов физики, а в законах физики никто ничего не проверяет. Да пусть будет цикл, но это не та проверка условий, пусть проверка условий - но не та система, как у человека.
0
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
14.07.2015, 15:03
Цитата Сообщение от Igor3D Посмотреть сообщение
при выполнении перехода кеш считанных команд будет утерян и потребуется какое-то доп время, но это не имеет фатальных/ужасных последствий
Конечно, ничего фатального.

Во-первых, большинство приложений не настолько критичны к скорости исполнения.
Во-вторых, современные процессоры используют довольно продвинутые алгоритмы предсказания и угадывают очень часто.

Цитата Сообщение от Igor3D Посмотреть сообщение
Не процессор а компилятор
Процессор.

"Древние" процессоры использовали самый примитивный алгоритм предсказания: предполагали, что условный переход никогда не выполнится. Именно поэтому указания likely/unlikely имели эффект.
Современные процессоры используют динамические (времени исполнения) алгоритмы предсказания.

Цитата Сообщение от https://ru.wikipedia.org/wiki/Предсказатель_переходов
Модуль предсказания переходов (прогнозирования ветвлений) (англ. branch prediction unit) — устройство, входящее в состав микропроцессоров, имеющих конвейерную архитектуру, предсказывающее, будет ли выполнен условный переход в исполняемой программе. Предсказание ветвлений позволяет сократить время простоя конвейера, за счёт предварительной загрузки и исполнения инструкций, которые должны выполниться после выполнения инструкции условного перехода. Прогнозирование ветвлений играет критическую роль, так как в большинстве случаев (точность предсказания переходов в современных процессорах превышает 90%) позволяет оптимально использовать вычислительные ресурсы процессора[1].
https://ru.wikipedia.org/wiki/... _переходов
0
1964 / 820 / 114
Регистрация: 01.10.2012
Сообщений: 4,782
Записей в блоге: 2
15.07.2015, 08:33
Цитата Сообщение от Shamil1 Посмотреть сообщение
"Древние" процессоры использовали самый примитивный алгоритм предсказания: предполагали, что условный переход никогда не выполнится. Именно поэтому указания likely/unlikely имели эффект.
Использую интеловские open-source которые "древними" никак не назовешь - там likely/unlikely везде. Хотя возможно это всего лишь стиль авторов. А вообще вещи такого плана (напр эффект inline, вызова виртуальных методов и.т.п.) давно "канули в лету". Это крохи. Практически если оптимизация не сулит хотя бы "в полтора раза" - нет смысла с ней связываться, она не окупает усложнение кода. А упорное обсуждение таких вещей (под флагом вики ) есть просто желание сачкануть и увильнуть от реальной работы - не более того
0
 Аватар для Hrethgir
421 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,206
Записей в блоге: 176
15.07.2015, 15:11  [ТС]
Не знаю, кажется на первый взгляд быстро, если:
псевдокод
Pascal
1
2
3
4
5
6
7
проверка: если x равно нулю то оборвать с предписаной операцией
начало:
проверка (предписание:  оборвать);
x:=x-x;
проверка (предписание: x:=1, оборвать);
x=-1;
конец
Ну данная конструкция может пригодится ещё часто, вроде так ничего, главное система отслеживается.
Что скажут критики?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.07.2015, 15:11
Помогаю со студенческими работами здесь

Функция проверки числа на деление без остатка на другое число
Привет! Как организовать проверку числа на то делится ли оно без остатка или нет И из этого предположим чтобы был ответ типо да или нет...

Функция Sign
подключив math.h (т.к. в описалове значится Unit: Math) не могу вызвать функцию Sign. Странно, но как раз в math.h ничего нет. ...

Нужна функция проверки вводимых данных в Access (БД "салон красоты")
Впервые приходится обращаться с подобным вопросом на форум, но из знакомых помочь реально никто не может, а сам я в VBA ни бум-бум((( ...

Проверки различных условий
char str1,str2,str3; // объявление массивов; unsigned int m; //объявление перменной ,после которой будет вставлена подстрока;...

Функция sign (линейный входной сигнал)
Есть диф. ур. третьего порядка. Входной сигнал не известен, но есть скорость изменения входного сигнала: dx/dt=x1*sign fi(t), где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru