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

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

09.07.2015, 15:11. Показов 4492. Ответов 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
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
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
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
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
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
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
266 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,295
Записей в блоге: 189
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
266 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,295
Записей в блоге: 189
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
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
13.07.2015, 19:14
Условный переход принципиально отличается от логической операции. Условный переход означает ветвление "потока" исполнения кода. Процессор не может точно знать заранее, какую ветку кода нужно загрузить, а может только строить догадки. И если он ошибётся и загрузит не ту ветку, то "потеряет" несколько десятков тактов (будет простаивать, пока загружается нужная ветка).

Именно по этой причине придумывались алгоритмы для вычисления функций типа signum, max, abs и т.п. без условных переходов.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,117
Записей в блоге: 2
14.07.2015, 11:00
Цитата Сообщение от Shamil1 Посмотреть сообщение
Условный переход принципиально отличается от логической операции. Условный переход означает ветвление "потока" исполнения кода. Процессор не может точно знать заранее, какую ветку кода нужно загрузить, а может только строить догадки. И если он ошибётся и загрузит не ту ветку, то "потеряет" несколько десятков тактов (будет простаивать, пока загружается нужная ветка).
Не процессор а компилятор - он не знает какую ветку поставить вперед. Это решается указаниями likely/unlikely, напр
C++
1
if (likely(a != 0)) ..
Но эффект такой оптимизации достаточно скромен. Т.е. да, при выполнении перехода кеш считанных команд будет утерян и потребуется какое-то доп время, но это не имеет фатальных/ужасных последствий.
0
 Аватар для Hrethgir
266 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,295
Записей в блоге: 189
14.07.2015, 15:00  [ТС]
Да, в общем, компилятор разрабатывали не нубы. Я всё равно программировать буду через циклы, массивы процедур, ну и Sign. Что могу сказать, пусть будет такая проверка условий, но, написание кода в такой манере будет вести меня к накоплению опыта и к систематизации. Условности я откидываю из учёта. Если я хочу создать свою систему и базу знаний (накопление опыта )быстро - я не должен брать в расчёт то, что является условным, так я эффективно достигну цели, а всё что условно - пыль. Пусть в Sign происходит проверка условий, но я не должен брать это в расчёт, пусть будут джампы, но это явление не физическое а архитектурное - значит я не должен это брать в расчёт.
В первую очередь - придерживаться физики, логика - это фаза физических процессов, и работает она, как ни крути, в рамках законов физики, а в законах физики никто ничего не проверяет. Да пусть будет цикл, но это не та проверка условий, пусть проверка условий - но не та система, как у человека.
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
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
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,117
Записей в блоге: 2
15.07.2015, 08:33
Цитата Сообщение от Shamil1 Посмотреть сообщение
"Древние" процессоры использовали самый примитивный алгоритм предсказания: предполагали, что условный переход никогда не выполнится. Именно поэтому указания likely/unlikely имели эффект.
Использую интеловские open-source которые "древними" никак не назовешь - там likely/unlikely везде. Хотя возможно это всего лишь стиль авторов. А вообще вещи такого плана (напр эффект inline, вызова виртуальных методов и.т.п.) давно "канули в лету". Это крохи. Практически если оптимизация не сулит хотя бы "в полтора раза" - нет смысла с ней связываться, она не окупает усложнение кода. А упорное обсуждение таких вещей (под флагом вики ) есть просто желание сачкануть и увильнуть от реальной работы - не более того
0
 Аватар для Hrethgir
266 / 143 / 3
Регистрация: 25.01.2012
Сообщений: 6,295
Записей в блоге: 189
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
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru