Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
ValeryS
Модератор
6405 / 4871 / 447
Регистрация: 14.02.2011
Сообщений: 16,167
20.03.2014, 19:03     Определение знака числа #1
тут опять потребовалась функция возвращающая -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);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2014, 19:03     Определение знака числа
Посмотрите здесь:

определение знака на отрезке функции Visual C++
C++ Преобразовать символьную запись целого десятичного числа без знака в целое число
C++ в прямоугольной матрице определить количество столбцов, содержащих только числа 1-го знака (положительного и отрицательного...
Определить, является ли введенная строка правильной записью целого шестнадцатеричного числа без знака C++
Программа перевода целого числа без знака в двоичную систему счисления C++
Программа перевода целого числа без знака в двоичную систему счисления C++
C++ Определить одного ли знака, два числа,вводимые с клавиатуры
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,901
Завершенные тесты: 1
20.03.2014, 19:55     Определение знака числа #2
Первый вариант, с if, самый лучший.
ValeryS
Модератор
6405 / 4871 / 447
Регистрация: 14.02.2011
Сообщений: 16,167
20.03.2014, 19:58  [ТС]     Определение знака числа #3
Цитата Сообщение от Nick Alte Посмотреть сообщение
Первый вариант, с if, самый лучший.
и самый тормозной
потому что идет ветвление
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
20.03.2014, 20:16     Определение знака числа #4
C
1
2
3
4
int foo( int n )
{
    return  (n != 0) | (n >> 31);
}
ValeryS
Модератор
6405 / 4871 / 447
Регистрация: 14.02.2011
Сообщений: 16,167
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));
}
может еще кто что предложит
KOPOJI
Модератор
 Аватар для KOPOJI
16577 / 6518 / 401
Регистрация: 12.06.2012
Сообщений: 19,537
Завершенные тесты: 1
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
ValeryS
Модератор
6405 / 4871 / 447
Регистрация: 14.02.2011
Сообщений: 16,167
20.03.2014, 20:39  [ТС]     Определение знака числа #7
Цитата Сообщение от KOPOJI Посмотреть сообщение
Позволю уточнить, что можно использовать строгое сравнение
тоже Да
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,901
Завершенные тесты: 1
20.03.2014, 21:57     Определение знака числа #8
Цитата Сообщение от ValeryS Посмотреть сообщение
и самый тормозной
О наличии-отсутствии сравнений в каждом варианте можно говорить только имея на руках ассемблерные листинги. Условное выражение преобразуется в число тоже не по волшебству, знаете ли. Это раз.
Пытаться заранее оптимизировать функцию, которая вряд ли критически важна для производительности, ценой серьёзного ухудшения понятности ради выигрыша пары десятков наносекунд за всё время работы программы, весьма опрометчиво. Это два. Как учил нас товарищ Кнут, "преждевременная оптимизация - источник всех бед".
ValeryS
Модератор
6405 / 4871 / 447
Регистрация: 14.02.2011
Сообщений: 16,167
20.03.2014, 22:12  [ТС]     Определение знака числа #9
Цитата Сообщение от Nick Alte Посмотреть сообщение
О наличии-отсутствии сравнений
речь не о сравнении
а о ветвлении
if(a==0)
преобразуется во что то типа
C++
1
2
cmp EAX,0;
jnz ......
и вот это jnz( как и любой условный переход) и есть тормоза

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

но угадал он или нет это по листингу не определишь, только в работе
Цитата Сообщение от Nick Alte Посмотреть сообщение
которая вряд ли критически важна для производительности,
а если я её вызываю 100500 раз
Цитата Сообщение от Nick Alte Посмотреть сообщение
ценой серьёзного ухудшения понятности
для меня все приведенные листинги понятны
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,901
Завершенные тесты: 1
20.03.2014, 22:28     Определение знака числа #10
Цитата Сообщение от ValeryS Посмотреть сообщение
преобразуется во что то типа
А во что преобразуется приведение условного выражения к числу? Не будет ли и там того же самого ужасного ветвления?
Цитата Сообщение от ValeryS Посмотреть сообщение
а если я её вызываю 100500 раз
А вот это выясняется уже при помощи профилировщика тогда, когда программа написана. И если программа проводит в этой функции 80% времени, то оптимизировать надо. И то в первую очередь надо думать об алгоритмической оптимизации, которая способна дать эффект на порядки больший, чем "зачистка" ветвлений. А если программа проводит в функции 0.05% времени, то польза от "зачистки" не будет заметна.
Цитата Сообщение от ValeryS Посмотреть сообщение
для меня все приведенные листинги понятны
Нормальные программы пишутся не для того, чтобы блеснуть оригинальностью и хитрыми приёмчиками. Большое количество таких "хитрых фокусов" увеличивает вероятность ошибки (как в задумке, так и обычных опечаток, вроде "<" вместо ">"). И пишутся они не только для того, чтобы понимать их самому в данный момент. Желательно, чтобы в программе мог легко разобраться человек со стороны или сам автор спустя пару лет.
KOPOJI
Модератор
 Аватар для KOPOJI
16577 / 6518 / 401
Регистрация: 12.06.2012
Сообщений: 19,537
Завершенные тесты: 1
20.03.2014, 22:40     Определение знака числа #11
Имхо, такие задачки просто заставляют мозги немного пошевелиться, в отличии от большинства задач в разделах.
Не думаю, что при оптимизации кода будет в первую очередь уделено внимание непосредственно способу определения знака числа (и подобным задачам), в которых "быть или не быть" определяется "if или не if".
ValeryS
Модератор
6405 / 4871 / 447
Регистрация: 14.02.2011
Сообщений: 16,167
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;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2014, 21:27     Определение знака числа
Еще ссылки по теме:

C++ Написать функцию вычисления знака числа
C++ В прямоугольной матрице определить количество столбцов, которые содержат только числа одного знака
Цикл while VS C++. Определение знака зодиака C++
C++ Проверка знака числа
C++ Определить, являются ли все числа последовательности одного знака

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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,901
Завершенные тесты: 1
21.03.2014, 21:27     Определение знака числа #13
Цитата Сообщение от ValeryS Посмотреть сообщение
не указано оно в исходнике
То, что в исходнике не написано слово if, ещё не значит, что ветвления не будет. Если в зависимости от условия надо получить одно число или другое, есть очень хорошие шансы за то, что это будет сделано именно ветвлением. Аналогично с тернарным оператором ?:
Цитата Сообщение от ValeryS Посмотреть сообщение
замена ветвления выражениями это не смена алгоритма?
Нет, это фокус сомнительной полезности. Алгоритмическое усовершенствование - это, например, запоминание и повторное использование результатов вместо повторного вычисления, или устранение необходимости вообще вычислять знак числа.
Цитата Сообщение от ValeryS Посмотреть сообщение
хотя смотря какие задачи
Не представляю себе задачу, состоящую в основном из вычисления знаков целых чисел, для которой настолько критична производительность.
Цитата Сообщение от ValeryS Посмотреть сообщение
эта понятность иногда приводит к тавтологии
В приведённом примере нет никакой дополнительной понятности по сравнению с нормальной конструкцией
C++
1
return a;
Напротив, он только запутывает и добавляет ненужную сложность.
Yandex
Объявления
21.03.2014, 21:27     Определение знака числа
Ответ Создать тему
Опции темы

Текущее время: 10:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru