Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/65: Рейтинг темы: голосов - 65, средняя оценка - 4.55
Модератор
Эксперт по электронике
8946 / 6712 / 921
Регистрация: 14.02.2011
Сообщений: 23,683
1

Определение знака числа

20.03.2014, 19:03. Показов 12862. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
тут опять потребовалась функция возвращающая -1 при отрицательном 1 при положительном и 0 при 0 числе
C++
1
2
3
4
5
6
7
8
9
int fnc(int n)
{
 if(n<0)
   return -1;
 if(n>0)
   return 1;
return 0;
 
}
но "это всем известно и никому не интересно"(с) Брыль "Чародеи"

вот изобрел
зацените

C++
1
2
3
4
int fnc(int n)
{
 return 0-(n<0)+(n>0);
}
Добавлено через 3 минуты
вот еще
C++
1
2
3
4
int fnc(int n)
{
 return (n>=0)-(n<=0);
}
2
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2014, 19:03
Ответы с готовыми решениями:

Определение целостности числа
Люди помогите. Нужно разделить число A на B и определить получается целое число или число с...

определение знака на отрезке функции
kak napisat programmy na c++ dly opredeleniy znaka na otrezke u funkcii

Определить, является ли введенная строка правильной записью целого шестнадцатеричного числа без знака
Определить, является ли введенная строка правильной записью целого шестнадцатеричного числа без...

Определение знака зодиака по дате
Помогите пожалуйста сделать листинг программы типа &quot;введите дату\месяц&quot; и выводится определенный...

21
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
20.03.2014, 19:55 2
Первый вариант, с if, самый лучший.
0
Модератор
Эксперт по электронике
8946 / 6712 / 921
Регистрация: 14.02.2011
Сообщений: 23,683
20.03.2014, 19:58  [ТС] 3
Цитата Сообщение от Nick Alte Посмотреть сообщение
Первый вариант, с if, самый лучший.
и самый тормозной
потому что идет ветвление
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
20.03.2014, 20:16 4
C
1
2
3
4
int foo( int n )
{
    return  (n != 0) | (n >> 31);
}
1
Модератор
Эксперт по электронике
8946 / 6712 / 921
Регистрация: 14.02.2011
Сообщений: 23,683
20.03.2014, 20:24  [ТС] 5
ISergey, вполне возможный вариант
но привязан к int 32 бита
тогда уж
C++
1
2
3
4
int foo( int n )
{
    return  (n != 0) | (n >> (sizeof(int)*8-1));
}
может еще кто что предложит
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
20.03.2014, 20:31 6
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
return (n>=0)-(n<=0);
Позволю уточнить, что можно использовать строгое сравнение
C++
1
return (n > 0) - (n < 0);
Потому, что, если n == 0, то оба условия дадут 0, а 0 - 0 == 0
1
Модератор
Эксперт по электронике
8946 / 6712 / 921
Регистрация: 14.02.2011
Сообщений: 23,683
20.03.2014, 20:39  [ТС] 7
Цитата Сообщение от KOPOJI Посмотреть сообщение
Позволю уточнить, что можно использовать строгое сравнение
тоже Да
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
20.03.2014, 21:57 8
Цитата Сообщение от ValeryS Посмотреть сообщение
и самый тормозной
О наличии-отсутствии сравнений в каждом варианте можно говорить только имея на руках ассемблерные листинги. Условное выражение преобразуется в число тоже не по волшебству, знаете ли. Это раз.
Пытаться заранее оптимизировать функцию, которая вряд ли критически важна для производительности, ценой серьёзного ухудшения понятности ради выигрыша пары десятков наносекунд за всё время работы программы, весьма опрометчиво. Это два. Как учил нас товарищ Кнут, "преждевременная оптимизация - источник всех бед".
0
Модератор
Эксперт по электронике
8946 / 6712 / 921
Регистрация: 14.02.2011
Сообщений: 23,683
20.03.2014, 22:12  [ТС] 9
Цитата Сообщение от Nick Alte Посмотреть сообщение
О наличии-отсутствии сравнений
речь не о сравнении
а о ветвлении
if(a==0)
преобразуется во что то типа
C++
1
2
cmp EAX,0;
jnz ......
и вот это jnz( как и любой условный переход) и есть тормоза

процессор загрузил в конвеер кучу данных и вот переход, если он не угадал, то выгружает все из конвеера и загружает новую порцию, в этом и есть тормоза, а если угадал то никаких тормозов

но угадал он или нет это по листингу не определишь, только в работе
Цитата Сообщение от Nick Alte Посмотреть сообщение
которая вряд ли критически важна для производительности,
а если я её вызываю 100500 раз
Цитата Сообщение от Nick Alte Посмотреть сообщение
ценой серьёзного ухудшения понятности
для меня все приведенные листинги понятны
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
20.03.2014, 22:28 10
Цитата Сообщение от ValeryS Посмотреть сообщение
преобразуется во что то типа
А во что преобразуется приведение условного выражения к числу? Не будет ли и там того же самого ужасного ветвления?
Цитата Сообщение от ValeryS Посмотреть сообщение
а если я её вызываю 100500 раз
А вот это выясняется уже при помощи профилировщика тогда, когда программа написана. И если программа проводит в этой функции 80% времени, то оптимизировать надо. И то в первую очередь надо думать об алгоритмической оптимизации, которая способна дать эффект на порядки больший, чем "зачистка" ветвлений. А если программа проводит в функции 0.05% времени, то польза от "зачистки" не будет заметна.
Цитата Сообщение от ValeryS Посмотреть сообщение
для меня все приведенные листинги понятны
Нормальные программы пишутся не для того, чтобы блеснуть оригинальностью и хитрыми приёмчиками. Большое количество таких "хитрых фокусов" увеличивает вероятность ошибки (как в задумке, так и обычных опечаток, вроде "<" вместо ">"). И пишутся они не только для того, чтобы понимать их самому в данный момент. Желательно, чтобы в программе мог легко разобраться человек со стороны или сам автор спустя пару лет.
1
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
20.03.2014, 22:40 11
Имхо, такие задачки просто заставляют мозги немного пошевелиться, в отличии от большинства задач в разделах.
Не думаю, что при оптимизации кода будет в первую очередь уделено внимание непосредственно способу определения знака числа (и подобным задачам), в которых "быть или не быть" определяется "if или не if".
1
Модератор
Эксперт по электронике
8946 / 6712 / 921
Регистрация: 14.02.2011
Сообщений: 23,683
21.03.2014, 10:44  [ТС] 12
Цитата Сообщение от Nick Alte Посмотреть сообщение
Не будет ли и там того же самого ужасного ветвления?
нет не будет
не указано оно в исходнике
Цитата Сообщение от Nick Alte Посмотреть сообщение
И то в первую очередь надо думать об алгоритмической оптимизации,
а это что?
замена ветвления выражениями это не смена алгоритма?
Цитата Сообщение от Nick Alte Посмотреть сообщение
Нормальные программы пишутся не для того, чтобы блеснуть оригинальностью и хитрыми приёмчиками.
Я не знаю что есть "нормальные программы"
есть требование по быстродействию, по объему кода, по объему занимаемой памяти и очень часто эти требования вступают в противоречие, друг с другом
и поддержка кода, безусловно важна, но стоит не на первом месте
хотя смотря какие задачи
если учебная программы, то наглядность стоит на первом месте
Цитата Сообщение от Nick Alte Посмотреть сообщение
Желательно, чтобы в программе мог легко разобраться человек со стороны
эта понятность иногда приводит к тавтологии, типа
C++
1
2
3
4
if(a==true)
  return true;
else
 return false;
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
21.03.2014, 21:27 13
Цитата Сообщение от ValeryS Посмотреть сообщение
не указано оно в исходнике
То, что в исходнике не написано слово if, ещё не значит, что ветвления не будет. Если в зависимости от условия надо получить одно число или другое, есть очень хорошие шансы за то, что это будет сделано именно ветвлением. Аналогично с тернарным оператором ?:
Цитата Сообщение от ValeryS Посмотреть сообщение
замена ветвления выражениями это не смена алгоритма?
Нет, это фокус сомнительной полезности. Алгоритмическое усовершенствование - это, например, запоминание и повторное использование результатов вместо повторного вычисления, или устранение необходимости вообще вычислять знак числа.
Цитата Сообщение от ValeryS Посмотреть сообщение
хотя смотря какие задачи
Не представляю себе задачу, состоящую в основном из вычисления знаков целых чисел, для которой настолько критична производительность.
Цитата Сообщение от ValeryS Посмотреть сообщение
эта понятность иногда приводит к тавтологии
В приведённом примере нет никакой дополнительной понятности по сравнению с нормальной конструкцией
C++
1
return a;
Напротив, он только запутывает и добавляет ненужную сложность.
0
0 / 0 / 0
Регистрация: 23.02.2021
Сообщений: 3
15.11.2023, 11:08 14
Правильно так:
C++
1
2
3
4
5
6
7
8
9
10
int fnc(int n)
{
 if(n<0)
  return -1;
  else
    if(n>0)
      return 1;
return 0;
 
}
0
Эксперт С++
4110 / 1909 / 958
Регистрация: 01.06.2021
Сообщений: 6,738
Записей в блоге: 6
15.11.2023, 11:35 15
C++
1
2
3
4
template <typename T> int sgn(T val) 
{
    return (T(0) < val) - (val < T(0));
}
0
Вездепух
Эксперт CЭксперт С++
12759 / 6643 / 1787
Регистрация: 18.10.2014
Сообщений: 16,799
15.11.2023, 11:36 16
Цитата Сообщение от AlexanderMal Посмотреть сообщение
Правильно так:
Нет правильно так: return (n > 0) - (n < 0).
0
567 / 469 / 99
Регистрация: 05.08.2022
Сообщений: 2,555
15.11.2023, 13:18 17
Цитата Сообщение от ValeryS Посмотреть сообщение
и самый тормозной
потому что идет ветвление
Посмотрел ассемблерный код.
С "математическими вычислениями" переходов в самом деле нет, но только потому, что есть оказывается спец. инструкции, загружающие или 0 или константу в регистр по флагам. В Z80 такой фигни не было!
0
Модератор
Эксперт по электронике
8946 / 6712 / 921
Регистрация: 14.02.2011
Сообщений: 23,683
15.11.2023, 22:12  [ТС] 18
Цитата Сообщение от KSergey9 Посмотреть сообщение
В Z80 такой фигни не было!
"вспомнила бабка как девкой была" а у 4004 было?
теме то уже 10 лет
0
567 / 469 / 99
Регистрация: 05.08.2022
Сообщений: 2,555
15.11.2023, 22:15 19
Цитата Сообщение от ValeryS Посмотреть сообщение
теме то уже 10 лет
Реально
0
Модератор
Эксперт по электронике
8946 / 6712 / 921
Регистрация: 14.02.2011
Сообщений: 23,683
15.11.2023, 22:16  [ТС] 20
Цитата Сообщение от ValeryS Посмотреть сообщение
теме то уже 10 лет
я уже долгое время сижу на stm32, а там уже совсем идеология другая
0
15.11.2023, 22:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2023, 22:16
Помогаю со студенческими работами здесь

Цикл while VS C++. Определение знака зодиака
{deleted} Код нужно переписывать в сообщение! Помогите решить проблему. Нужно сделать выполнения...

Определить цифры целого числа (тип числа - целое без знака)
Определить цифры целого числа( тип числа-целое без знака), вычислить сумму полученных цифр....

Проверка знака числа
Есть программа, она считает все делители числа и их сумму, но и считает также отрицательные числа....

Написать функцию вычисления знака числа
Здравствуйте! Прошу прощения за глупый вопрос, мог бы спросить и у препода, но ждать долго, а сдать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru