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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,722
#1

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

20.03.2014, 19:03. Просмотров 1857. Ответов 12
Метки нет (Все метки)

тут опять потребовалась функция возвращающая -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     Определение знака числа
Посмотрите здесь:

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

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

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

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

Определить, являются ли все числа последовательности одного знака - C++
C++ Дана последовательность из вещественных чисел, которые вводятся по одному. За последним числом вводится нуль. Определить, являются ли...

Определить одного ли знака, два числа,вводимые с клавиатуры - C++
Помогите решить пожалуйста)))Спасибо заранее)Определить одного ли знака, два числа,вводимые с клавиатуры

Программа перевода целого числа без знака в двоичную систему счисления - C++
Здравствуйте . Помогите , пожалуйста , реализовать программу перевода целого числа без знака в двоичную систему счисления , при этом выдать...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
20.03.2014, 19:55     Определение знака числа #2
Первый вариант, с if, самый лучший.
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,722
20.03.2014, 19:58  [ТС]     Определение знака числа #3
Цитата Сообщение от Nick Alte Посмотреть сообщение
Первый вариант, с if, самый лучший.
и самый тормозной
потому что идет ветвление
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
20.03.2014, 20:16     Определение знака числа #4
C
1
2
3
4
int foo( int n )
{
    return  (n != 0) | (n >> 31);
}
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,722
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
Модератор
Эксперт HTML/CSSЭксперт PHP
16694 / 6620 / 431
Регистрация: 12.06.2012
Сообщений: 19,875
Завершенные тесты: 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
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,722
20.03.2014, 20:39  [ТС]     Определение знака числа #7
Цитата Сообщение от KOPOJI Посмотреть сообщение
Позволю уточнить, что можно использовать строгое сравнение
тоже Да
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
20.03.2014, 21:57     Определение знака числа #8
Цитата Сообщение от ValeryS Посмотреть сообщение
и самый тормозной
О наличии-отсутствии сравнений в каждом варианте можно говорить только имея на руках ассемблерные листинги. Условное выражение преобразуется в число тоже не по волшебству, знаете ли. Это раз.
Пытаться заранее оптимизировать функцию, которая вряд ли критически важна для производительности, ценой серьёзного ухудшения понятности ради выигрыша пары десятков наносекунд за всё время работы программы, весьма опрометчиво. Это два. Как учил нас товарищ Кнут, "преждевременная оптимизация - источник всех бед".
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,722
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
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
20.03.2014, 22:28     Определение знака числа #10
Цитата Сообщение от ValeryS Посмотреть сообщение
преобразуется во что то типа
А во что преобразуется приведение условного выражения к числу? Не будет ли и там того же самого ужасного ветвления?
Цитата Сообщение от ValeryS Посмотреть сообщение
а если я её вызываю 100500 раз
А вот это выясняется уже при помощи профилировщика тогда, когда программа написана. И если программа проводит в этой функции 80% времени, то оптимизировать надо. И то в первую очередь надо думать об алгоритмической оптимизации, которая способна дать эффект на порядки больший, чем "зачистка" ветвлений. А если программа проводит в функции 0.05% времени, то польза от "зачистки" не будет заметна.
Цитата Сообщение от ValeryS Посмотреть сообщение
для меня все приведенные листинги понятны
Нормальные программы пишутся не для того, чтобы блеснуть оригинальностью и хитрыми приёмчиками. Большое количество таких "хитрых фокусов" увеличивает вероятность ошибки (как в задумке, так и обычных опечаток, вроде "<" вместо ">"). И пишутся они не только для того, чтобы понимать их самому в данный момент. Желательно, чтобы в программе мог легко разобраться человек со стороны или сам автор спустя пару лет.
KOPOJI
Модератор
Эксперт HTML/CSSЭксперт PHP
16694 / 6620 / 431
Регистрация: 12.06.2012
Сообщений: 19,875
Завершенные тесты: 1
20.03.2014, 22:40     Определение знака числа #11
Имхо, такие задачки просто заставляют мозги немного пошевелиться, в отличии от большинства задач в разделах.
Не думаю, что при оптимизации кода будет в первую очередь уделено внимание непосредственно способу определения знака числа (и подобным задачам), в которых "быть или не быть" определяется "if или не if".
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,722
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++
Преобразовать символьную запись целого десятичного числа без знака в целое число. В записи исходного числа могут быть пробелы (до и после...

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

в прямоугольной матрице определить количество столбцов, содержащих только числа 1-го знака (положительного и отрицательного... - C++
в прямоугольной матрице определить количество столбцов, содержащих только числа 1-го знака (положительного и отрицательного) и не...

Определить, является ли введенная строка правильной записью целого шестнадцатеричного числа без знака - C++
Помогите с задачами. 1)Определить, является ли введенная строка правильной записью целого шестнадцатеричного числа без знака. 2)...


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

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

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