Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,797

Оператор modulo

20.07.2021, 14:28. Показов 2138. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
в языке C++ (-13) % 26 вычисляется как -13, что для меня странно, т.к. я ожидаю 13.

Начиная от обычных калькуляторов и заканчивая системами компьютерной алгебры Mathematica (функция Mod), Maple (функция mod), Maxima (функция mod) - данное выражение вычисляется как 13.

Попытался понять в чем проблема и вроде бы ответ нашел в статье англ. Википедии "Modulo operation".
Оказывается большинство программ в формуле modulo используют floored definition, а вот C++ использует truncated definition.

Не знаю, кто придумал такой подход в C++, но truncated definition правильнее было бы использовать для функции remainder, а не для modulo. Многие математические программы различают функции remainder и modulo.

Ну да ладно, не буду критиковать C++, придуманный умными людьми, а лучше спрошу у опытных программистов, какая функция в C++ вычисляет modulo так, как это делают мат. пакеты и все калькуляторы?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.07.2021, 14:28
Ответы с готовыми решениями:

Написать программу, содержащую оператор оператор for для счета от 2 до 5 через 1
В С++ я ноль, помогите пожалуйста написать прогу Написать программу, содержащую оператор оператор for для счета от 2 до 5 через 1 ...

Условный оператор, оператор ввода/вывода; плоскость и принадлежность точки
Здравствуйте. В С++ я абсолютный новичок, поэтому с первым же заданием возникли определённые трудности. Будьте добры, помогите решить. Буду...

Перегрузить для класса Vector оператор умножения и оператор разности
Перегрузить для класса Vector оператор умножения (умножение вектора на число) Перегрузить оператор разности Перегрузить оператор ввода...

16
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
20.07.2021, 14:48
Royal_X, Да, оператор % в Си работает "не математически". Надо создавать собственную функия, что я думаю, для тебя не сложно.
1
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
20.07.2021, 14:50
Это потому, что все сводится к ассемблерной команде idiv, которая работает именно так
0
Модератор
Эксперт CЭксперт С++
 Аватар для Volga_
5209 / 2926 / 1509
Регистрация: 14.12.2018
Сообщений: 5,266
Записей в блоге: 1
20.07.2021, 14:57
Royal_X, как я понимаю, в С/С++ нахождение выражения a % b значит, что нужно найти число d чтобы следующее уравнение имеет решение с неизвестным t:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\{\begin{matrix}<br />
a=b.t+d\\ <br />
t\geq 0 \\<br />
|d|<|b|<br />
\end{matrix}\right.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,797
20.07.2021, 15:04  [ТС]
как понимаю, мне нужна такая функция

a mod b = a - b * floor(a/b)

Добавлено через 4 минуты
а вот C++ использует

a mod b = a - b * trunc(a/b)
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
20.07.2021, 15:06
Royal_X, совершенно верно.
C++
1
2
3
4
int remainder(int a, int b)
{
    return a - floor((double) a / b) * b;
}
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.07.2021, 15:07
Лучший ответ Сообщение было отмечено Royal_X как решение

Решение

Цитата Сообщение от Royal_X Посмотреть сообщение
какая функция в C++ вычисляет modulo так, как это делают мат. пакеты и все калькуляторы?
Для плавающей точки есть std::remainder
https://en.cppreference.com/w/... /remainder

Для целых руками только если написать.

Добавлено через 20 секунд
Royal_X,

что-то такое можно сварганить
C++
1
2
3
4
int modulo(int m, int n) 
{ 
    return m >= 0 ? m % n : ( n - abs( m % n ) ) % n; 
}
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,797
20.07.2021, 15:31  [ТС]
правильно ли я понимаю, что если числа положительные, то можно и встроенным оператором % пользоваться?

Добавлено через 6 минут
Создал функцию:

C++
1
2
3
int modulo(int a, int b){
      return a - floor((float) a / b) * b;
}
Решил использовать float, т.к. целые числа небольшие.

В моем коде modulo нужна в двух местах. В одном случае числа положительные, поэтому как вы думаете, лучше использовать встроенный оператор % для этого случая, а пользовательскую функцию только для второго случая, в котором могут быть и отрицательные числа?
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
20.07.2021, 16:00
Royal_X, для положительных % работает, как и ожидается
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.07.2021, 16:06
Цитата Сообщение от Royal_X Посмотреть сообщение
правильно ли я понимаю, что если числа положительные, то можно и встроенным оператором % пользоваться?
Да.

Цитата Сообщение от Royal_X Посмотреть сообщение
Создал функцию
Зачем вы взяли заведомо более медленный вариант, если заранее известно, что числа у вас целые?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,797
20.07.2021, 16:08  [ТС]
liv, тогда для положительных буду использовать %, думаю, она лучше оптимизирована, чем пользовательская функция, опирающаяся на floor из <cmath>

Добавлено через 45 секунд
DrOffset, ваш вариант будет быстрее?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.07.2021, 16:22
Цитата Сообщение от Royal_X Посмотреть сообщение
ваш вариант будет быстрее?
Конечно.
Во-первых у меня там нет floating-point деления. Это уже все решает.
Во-вторых у вас по-любому будет вызов библитечной сишной функции.

Кстати, ваше приведение к float ничего не решит, потому что floor все равно принимает double.

PS. решит, если подключать cmath, вместо math.h, и соответственно использовать std::floor
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,797
20.07.2021, 17:54  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
PS. решит, если подключать cmath, вместо math.h, и соответственно использовать std::floor
я еще не разбираюсь в заголовках, поэтому всегда смотрю справочник (использую оффлайновый cppreference). Так вот, там написано, что <cmath> это заголовок для C++, тогда как <math.h> это заголовок для C. По этой причине я предпочел использовать <cmath>.

Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем вы взяли заведомо более медленный вариант, если заранее известно, что числа у вас целые?
я взял тот, который понимал, теперь поменяю на ваш

Цитата Сообщение от DrOffset Посмотреть сообщение
Конечно.
Во-первых у меня там нет floating-point деления. Это уже все решает.
т.е. return m >= 0 ? m % n : ( n - abs( m % n ) ) % n; быстрее return a - floor((float) a / b) * b; ?

простите, что надоедаю такими простыми вопросами, просто я не из тех, кто любит просто копировать готовые коды, я еще хочу разобраться)

Добавлено через 8 минут
DrOffset, подключены только <iostream> и <string>, но как может быть, чтобы abs у меня работает без <cmath> или <cstdlib> или <math.h> и других библиотек (в справочнике написано, что хотя бы одна из них ей нужна)?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.07.2021, 17:56
Цитата Сообщение от Royal_X Посмотреть сообщение
быстрее
Да, гораздо быстрее.
Зайдите на godbolt.org и посмотрите дизассемблер этих двух вариантов, если хотите убедиться.

Добавлено через 1 минуту
Цитата Сообщение от Royal_X Посмотреть сообщение
подключены только <iostream> и <string>
Один из них скорее всего цепляет cstdlib.
Но вы все-таки должны подключить самостоятельно заголовочный файл, а не полагаться на это.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,797
20.07.2021, 18:09  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Один из них скорее всего цепляет cstdlib
хорошо, я тогда пропишу <cstdlib>, думаю, что это будет лучше <cmath>, т.к. в последней слишком много мат функций, чтобы не нагружать проект. Или количество функций в библиотеке не играет роли на оптимизацию?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
20.07.2021, 18:27
Количество реализованных функций влияет только на размер исполняемого файла.
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
20.07.2021, 20:20
Цитата Сообщение от Royal_X Посмотреть сообщение
Или количество функций в библиотеке не играет роли на оптимизацию?
Не влияет.

Цитата Сообщение от Royal_X Посмотреть сообщение
>, т.к. в последней слишком много мат функций, чтобы не нагружать проект.
Вы так ничего не перегрузите. В заголовочном файле только объявления, а нужные функции в динамических библиотеках находятся, .

Добавлено через 1 минуту
Цитата Сообщение от TRam_ Посмотреть сообщение
влияет только на размер исполняемого файла.
Royal_X, это только если статическая линковка используется. А так все эти функции находятся отдельно от вашего исполняемого файла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.07.2021, 20:20
Помогаю со студенческими работами здесь

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор *
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Для чего нужен оператор двоеточие, если два двоеточия - это оператор расширения области видимости
для чего нужен оператор двоеточие ( : ), если два двоеточия( :: ) - это оператор расширения области видимости.

Копирующий оператор присвоения и оператор + Не работают
Такая ситуация. Я - самоучка, пытаюсь выучить С++ по книге Сиддхартха Роа &quot;Освой самостоятельно С++ по часу в день. 8-е издание&quot;. Там...

Почему обращение к методам осуществляется через оператор прямого доступа, а не через оператор указателей->?
#include &lt;iostream&gt; using namespace std; class random { public: void Set(int b){a=b;} int Get(){return a;} private: ...

Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры.
Применяя оператор цикла FOR вычислить y. Оператор if в теле цикла не использовать. Значение m и n вводить с клавиатуры. Шаг изменения...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru