Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
ValeryS
Модератор
6749 / 5158 / 493
Регистрация: 14.02.2011
Сообщений: 17,331
#1

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

20.03.2014, 19:03. Просмотров 2008. Ответов 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);
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2014, 19:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определение знака числа (C++):

Как просчитать число ПИ до определенного знака? - C++
Подскажите удобную формулу.

Вопрос по знаку ; Реакция программы с применением этого знака и без него - C++
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; int main() { int fahr; for(fahr=0; fahr &lt;= 300; fahr= fahr + 20) printf(&quot;%4d...

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

Убрать все символы до знака - C++ Builder
Я нашёл тему на форуме где описано как удалить после знака &quot;=&quot; и пользователь Drygba дал хороший ответ (по крайней мере для меня) как...

Отображение списка методов после знака -> - C++ Builder
у меня borland c++ 6. Проблема в том что после прописания -&gt; после имени обькта не всплывает список методов и событий и др:). Как исправить...

Как вывести два знака после запятой - C++ Builder
Всем добрый вечер. Начал изучать c++ builder и не помогу понять как выводить два знака после запятой... P.S. Правильно ли я сделал...

12
Nick Alte
Эксперт С++
1643 / 1015 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
20.03.2014, 19:55 #2
Первый вариант, с if, самый лучший.
0
ValeryS
Модератор
6749 / 5158 / 493
Регистрация: 14.02.2011
Сообщений: 17,331
20.03.2014, 19:58  [ТС] #3
Цитата Сообщение от Nick Alte Посмотреть сообщение
Первый вариант, с if, самый лучший.
и самый тормозной
потому что идет ветвление
0
ISergey
Maniac
Эксперт С++
1396 / 907 / 56
Регистрация: 02.01.2009
Сообщений: 2,712
Записей в блоге: 1
20.03.2014, 20:16 #4
C
1
2
3
4
int foo( int n )
{
    return  (n != 0) | (n >> 31);
}
1
ValeryS
Модератор
6749 / 5158 / 493
Регистрация: 14.02.2011
Сообщений: 17,331
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
KOPOJI
Эксперт HTML/CSSЭксперт PHP
16702 / 6624 / 433
Регистрация: 12.06.2012
Сообщений: 19,879
Завершенные тесты: 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
1
ValeryS
Модератор
6749 / 5158 / 493
Регистрация: 14.02.2011
Сообщений: 17,331
20.03.2014, 20:39  [ТС] #7
Цитата Сообщение от KOPOJI Посмотреть сообщение
Позволю уточнить, что можно использовать строгое сравнение
тоже Да
0
Nick Alte
Эксперт С++
1643 / 1015 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
20.03.2014, 21:57 #8
Цитата Сообщение от ValeryS Посмотреть сообщение
и самый тормозной
О наличии-отсутствии сравнений в каждом варианте можно говорить только имея на руках ассемблерные листинги. Условное выражение преобразуется в число тоже не по волшебству, знаете ли. Это раз.
Пытаться заранее оптимизировать функцию, которая вряд ли критически важна для производительности, ценой серьёзного ухудшения понятности ради выигрыша пары десятков наносекунд за всё время работы программы, весьма опрометчиво. Это два. Как учил нас товарищ Кнут, "преждевременная оптимизация - источник всех бед".
0
ValeryS
Модератор
6749 / 5158 / 493
Регистрация: 14.02.2011
Сообщений: 17,331
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
Nick Alte
Эксперт С++
1643 / 1015 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
20.03.2014, 22:28 #10
Цитата Сообщение от ValeryS Посмотреть сообщение
преобразуется во что то типа
А во что преобразуется приведение условного выражения к числу? Не будет ли и там того же самого ужасного ветвления?
Цитата Сообщение от ValeryS Посмотреть сообщение
а если я её вызываю 100500 раз
А вот это выясняется уже при помощи профилировщика тогда, когда программа написана. И если программа проводит в этой функции 80% времени, то оптимизировать надо. И то в первую очередь надо думать об алгоритмической оптимизации, которая способна дать эффект на порядки больший, чем "зачистка" ветвлений. А если программа проводит в функции 0.05% времени, то польза от "зачистки" не будет заметна.
Цитата Сообщение от ValeryS Посмотреть сообщение
для меня все приведенные листинги понятны
Нормальные программы пишутся не для того, чтобы блеснуть оригинальностью и хитрыми приёмчиками. Большое количество таких "хитрых фокусов" увеличивает вероятность ошибки (как в задумке, так и обычных опечаток, вроде "<" вместо ">"). И пишутся они не только для того, чтобы понимать их самому в данный момент. Желательно, чтобы в программе мог легко разобраться человек со стороны или сам автор спустя пару лет.
1
KOPOJI
Эксперт HTML/CSSЭксперт PHP
16702 / 6624 / 433
Регистрация: 12.06.2012
Сообщений: 19,879
Завершенные тесты: 1
20.03.2014, 22:40 #11
Имхо, такие задачки просто заставляют мозги немного пошевелиться, в отличии от большинства задач в разделах.
Не думаю, что при оптимизации кода будет в первую очередь уделено внимание непосредственно способу определения знака числа (и подобным задачам), в которых "быть или не быть" определяется "if или не if".
1
ValeryS
Модератор
6749 / 5158 / 493
Регистрация: 14.02.2011
Сообщений: 17,331
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
Nick Alte
Эксперт С++
1643 / 1015 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
21.03.2014, 21:27 #13
Цитата Сообщение от ValeryS Посмотреть сообщение
не указано оно в исходнике
То, что в исходнике не написано слово if, ещё не значит, что ветвления не будет. Если в зависимости от условия надо получить одно число или другое, есть очень хорошие шансы за то, что это будет сделано именно ветвлением. Аналогично с тернарным оператором ?:
Цитата Сообщение от ValeryS Посмотреть сообщение
замена ветвления выражениями это не смена алгоритма?
Нет, это фокус сомнительной полезности. Алгоритмическое усовершенствование - это, например, запоминание и повторное использование результатов вместо повторного вычисления, или устранение необходимости вообще вычислять знак числа.
Цитата Сообщение от ValeryS Посмотреть сообщение
хотя смотря какие задачи
Не представляю себе задачу, состоящую в основном из вычисления знаков целых чисел, для которой настолько критична производительность.
Цитата Сообщение от ValeryS Посмотреть сообщение
эта понятность иногда приводит к тавтологии
В приведённом примере нет никакой дополнительной понятности по сравнению с нормальной конструкцией
C++
1
return a;
Напротив, он только запутывает и добавляет ненужную сложность.
0
21.03.2014, 21:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2014, 21:27
Привет! Вот еще темы с ответами:

Как найти позицию символа от n-ого знака вверх. - C++ Builder
1.Text.Pos() находит заданный символ в тексте. А что если мне нужно искать не от 1 символа и вниз, а от 9 символа вверх? 2.Есть...

Как сделать чтобы в ячейку StrigGrid можно было вводить только 4 знака? - C++ Builder
И такой вопрос, не относящийся к теме вот у меня StrigGrid, как сделать чтобы в ячейку можно было вводить только 4 знака?

Определение числа соседств двух чисел разного знака (Блок-схема) - Turbo Pascal
составьте пожалуйста блок схему к программе uses crt; var n,i,k:integer; a:array of integer; Begin clrscr; k:=0; ...

определение знака - C#
Доброго времени суток. Пишу программу суть которой состоит в определении знаков массива. То есть у нас есть некий массив и программа, при...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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