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

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

20.03.2014, 19:03. Показов 13176. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.03.2014, 19:03
Ответы с готовыми решениями:

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

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

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

21
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
20.03.2014, 19:55
Первый вариант, с if, самый лучший.
0
Модератор
Эксперт по электронике
8962 / 6728 / 921
Регистрация: 14.02.2011
Сообщений: 23,750
20.03.2014, 19:58  [ТС]
Цитата Сообщение от Nick Alte Посмотреть сообщение
Первый вариант, с if, самый лучший.
и самый тормозной
потому что идет ветвление
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
20.03.2014, 20:16
C Скопировано
1
2
3
4
int foo( int n )
{
    return  (n != 0) | (n >> 31);
}
1
Модератор
Эксперт по электронике
8962 / 6728 / 921
Регистрация: 14.02.2011
Сообщений: 23,750
20.03.2014, 20:24  [ТС]
ISergey, вполне возможный вариант
но привязан к int 32 бита
тогда уж
C++ Скопировано
1
2
3
4
int foo( int n )
{
    return  (n != 0) | (n >> (sizeof(int)*8-1));
}
может еще кто что предложит
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
20.03.2014, 20:31
Цитата Сообщение от ValeryS Посмотреть сообщение
C++ Скопировано
1
return (n>=0)-(n<=0);
Позволю уточнить, что можно использовать строгое сравнение
C++ Скопировано
1
return (n > 0) - (n < 0);
Потому, что, если n == 0, то оба условия дадут 0, а 0 - 0 == 0
1
Модератор
Эксперт по электронике
8962 / 6728 / 921
Регистрация: 14.02.2011
Сообщений: 23,750
20.03.2014, 20:39  [ТС]
Цитата Сообщение от KOPOJI Посмотреть сообщение
Позволю уточнить, что можно использовать строгое сравнение
тоже Да
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
20.03.2014, 21:57
Цитата Сообщение от ValeryS Посмотреть сообщение
и самый тормозной
О наличии-отсутствии сравнений в каждом варианте можно говорить только имея на руках ассемблерные листинги. Условное выражение преобразуется в число тоже не по волшебству, знаете ли. Это раз.
Пытаться заранее оптимизировать функцию, которая вряд ли критически важна для производительности, ценой серьёзного ухудшения понятности ради выигрыша пары десятков наносекунд за всё время работы программы, весьма опрометчиво. Это два. Как учил нас товарищ Кнут, "преждевременная оптимизация - источник всех бед".
0
Модератор
Эксперт по электронике
8962 / 6728 / 921
Регистрация: 14.02.2011
Сообщений: 23,750
20.03.2014, 22:12  [ТС]
Цитата Сообщение от 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
Цитата Сообщение от ValeryS Посмотреть сообщение
преобразуется во что то типа
А во что преобразуется приведение условного выражения к числу? Не будет ли и там того же самого ужасного ветвления?
Цитата Сообщение от ValeryS Посмотреть сообщение
а если я её вызываю 100500 раз
А вот это выясняется уже при помощи профилировщика тогда, когда программа написана. И если программа проводит в этой функции 80% времени, то оптимизировать надо. И то в первую очередь надо думать об алгоритмической оптимизации, которая способна дать эффект на порядки больший, чем "зачистка" ветвлений. А если программа проводит в функции 0.05% времени, то польза от "зачистки" не будет заметна.
Цитата Сообщение от ValeryS Посмотреть сообщение
для меня все приведенные листинги понятны
Нормальные программы пишутся не для того, чтобы блеснуть оригинальностью и хитрыми приёмчиками. Большое количество таких "хитрых фокусов" увеличивает вероятность ошибки (как в задумке, так и обычных опечаток, вроде "<" вместо ">"). И пишутся они не только для того, чтобы понимать их самому в данный момент. Желательно, чтобы в программе мог легко разобраться человек со стороны или сам автор спустя пару лет.
1
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
20.03.2014, 22:40
Имхо, такие задачки просто заставляют мозги немного пошевелиться, в отличии от большинства задач в разделах.
Не думаю, что при оптимизации кода будет в первую очередь уделено внимание непосредственно способу определения знака числа (и подобным задачам), в которых "быть или не быть" определяется "if или не if".
1
Модератор
Эксперт по электронике
8962 / 6728 / 921
Регистрация: 14.02.2011
Сообщений: 23,750
21.03.2014, 10:44  [ТС]
Цитата Сообщение от 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
Цитата Сообщение от ValeryS Посмотреть сообщение
не указано оно в исходнике
То, что в исходнике не написано слово if, ещё не значит, что ветвления не будет. Если в зависимости от условия надо получить одно число или другое, есть очень хорошие шансы за то, что это будет сделано именно ветвлением. Аналогично с тернарным оператором ?:
Цитата Сообщение от ValeryS Посмотреть сообщение
замена ветвления выражениями это не смена алгоритма?
Нет, это фокус сомнительной полезности. Алгоритмическое усовершенствование - это, например, запоминание и повторное использование результатов вместо повторного вычисления, или устранение необходимости вообще вычислять знак числа.
Цитата Сообщение от ValeryS Посмотреть сообщение
хотя смотря какие задачи
Не представляю себе задачу, состоящую в основном из вычисления знаков целых чисел, для которой настолько критична производительность.
Цитата Сообщение от ValeryS Посмотреть сообщение
эта понятность иногда приводит к тавтологии
В приведённом примере нет никакой дополнительной понятности по сравнению с нормальной конструкцией
C++ Скопировано
1
return a;
Напротив, он только запутывает и добавляет ненужную сложность.
0
0 / 0 / 0
Регистрация: 23.02.2021
Сообщений: 3
15.11.2023, 11:08
Правильно так:
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
4514 / 2400 / 987
Регистрация: 01.06.2021
Сообщений: 8,294
15.11.2023, 11:35
C++ Скопировано
1
2
3
4
template <typename T> int sgn(T val) 
{
    return (T(0) < val) - (val < T(0));
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12873 / 6737 / 1810
Регистрация: 18.10.2014
Сообщений: 17,057
15.11.2023, 11:36
Цитата Сообщение от AlexanderMal Посмотреть сообщение
Правильно так:
Нет правильно так: return (n > 0) - (n < 0).
0
617 / 513 / 104
Регистрация: 05.08.2022
Сообщений: 2,775
15.11.2023, 13:18
Цитата Сообщение от ValeryS Посмотреть сообщение
и самый тормозной
потому что идет ветвление
Посмотрел ассемблерный код.
С "математическими вычислениями" переходов в самом деле нет, но только потому, что есть оказывается спец. инструкции, загружающие или 0 или константу в регистр по флагам. В Z80 такой фигни не было!
0
Модератор
Эксперт по электронике
8962 / 6728 / 921
Регистрация: 14.02.2011
Сообщений: 23,750
15.11.2023, 22:12  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
В Z80 такой фигни не было!
"вспомнила бабка как девкой была" а у 4004 было?
теме то уже 10 лет
0
617 / 513 / 104
Регистрация: 05.08.2022
Сообщений: 2,775
15.11.2023, 22:15
Цитата Сообщение от ValeryS Посмотреть сообщение
теме то уже 10 лет
Реально
0
Модератор
Эксперт по электронике
8962 / 6728 / 921
Регистрация: 14.02.2011
Сообщений: 23,750
15.11.2023, 22:16  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
теме то уже 10 лет
я уже долгое время сижу на stm32, а там уже совсем идеология другая
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.11.2023, 22:16
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оптимизация производительности Node.js с помощью кластеризации
run.dev 04.04.2025
Масштабирование приложений для обработки тысяч и миллионов запросов — обыденная задача для многих команд. Node. js, благодаря своей асинхронной событийно-ориентированной архитектуре, стал популярной. . .
Управление зависимостями в Python с Poetry
py-thonny 04.04.2025
Стандартный инструмент для установки пакетов в Python - pip - прекрасно справляется с базовыми сценариями: установил пакет командой pip install и используешь его. Но что произойдёт, когда разные. . .
Мониторинг с Prometheus в PHP
Jason-Webb 04.04.2025
Prometheus выделяется среди других систем мониторинга своим подходом к сбору и хранению метрик. В отличие от New Relic, который использует агентный подход и отправляет данные во внешнее хранилище,. . .
Пакет Context в Golang: Управление потоками и ресурсами
golander 04.04.2025
Работа с горутинами в Go часто напоминает управление непослушными детьми - они разбегаются кто куда, делают что хотят и не всегда завершаются вовремя. К счастью, в Go 1. 7 появился пакет context,. . .
Контейнеризация React приложений с Docker
Reangularity 03.04.2025
Контейнеризация позволяет упаковать приложение со всеми его зависимостями в автономный контейнер, который можно запустить на любой платформе с установленным Docker. Это существенно упрощает процессы. . .
Свой попап в SwiftUI
mobDevWorks 03.04.2025
SwiftUI, как декларативный фреймворк от Apple, предоставляет множество инструментов для создания пользовательских интерфейсов. В нашем распоряжении есть такие API как alerts, popovers, action sheets. . .
Антипаттерны микросервисной архитектуры
ArchitectMsa 03.04.2025
Хорошо спроектированная микросервисная система может выдержать испытание временем, оставаясь гибкой, масштабируемой и устойчивой к большинству проблем. Такая архитектура обладает высоким уровнем. . .
std::mutex в C++: Советы и примеры использования
bytestream 03.04.2025
std::mutex - это механизм взаимного исключения, который гарантирует, что критический участок кода выполняется только одним потоком в каждый момент времени. Это простое, но могущественное средство. . .
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
Метод с двумя буферами (или double buffering) или ping-pong buffering
Hrethgir 02.04.2025
Из ответов LM модели. Метод, который предполагает использование двух массивов для хранения промежуточных результатов сложения векторов, обычно применяется в сценариях, где необходимо минимизировать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер