"Математикам стоит обратить внимание на то, что деление и подсчёт остатка для отрицательных чисел работает в C++ «неправильно». Если в C++ мы разделим отрицательное число на положительное, например, посчитаем результат операции −7 / 3, то получим −2. Фактически в C++ отрицательное число берётся по модулю, делится, а затем к результату приписывается минус."
А в математике разве не так?
Другие языки программирования и технологии
Особенности арифметических операций в C++, деление отрицательных чисел, вопрос ниже
Для начала нужно понять, что деление с остатком, это не обычное деление с округлением до ближайшего целого числа.
Из вики : "Деление с остатком a («делимого») на b («делитель») означает нахождение таких целых чисел q(неполное частное) и r(остаток от деления), что выполняется равенство: a = b ⋅ q + r.
При делении с остатком отрицательного числа a = − 78 на b = 33 получаем неполное частное q = − 3 и остаток r = 21.
Проверка: − 78 = 33 ⋅ ( − 3 ) + 21."
Т. е. по сути, т. к. остаток мы должны прибавлять и он положителен, то и при положительном и при отрицательном делимом, мы должны округлять число до нижнего целого.
Из вики : "Деление с остатком a («делимого») на b («делитель») означает нахождение таких целых чисел q(неполное частное) и r(остаток от деления), что выполняется равенство: a = b ⋅ q + r.
При делении с остатком отрицательного числа a = − 78 на b = 33 получаем неполное частное q = − 3 и остаток r = 21.
Проверка: − 78 = 33 ⋅ ( − 3 ) + 21."
Т. е. по сути, т. к. остаток мы должны прибавлять и он положителен, то и при положительном и при отрицательном делимом, мы должны округлять число до нижнего целого.
Максим Николаевич
Да почитал вики и понял
На пальцах:
6/3 = 2 ,
5/3 = 1, 4/3 = 1, 3/3 = 1 ,
2/3 = 0, 1/3 = 0, 0/3 = 0 ,
-1/3 = -1 , -2/3 = -1 , -3/3 = -1 ,
-4/3 = -2 , -5/3 = -2 , -6/3 = -2 ,
-7/3 = -3
А не -2.
6/3 = 2 ,
5/3 = 1, 4/3 = 1, 3/3 = 1 ,
2/3 = 0, 1/3 = 0, 0/3 = 0 ,
-1/3 = -1 , -2/3 = -1 , -3/3 = -1 ,
-4/3 = -2 , -5/3 = -2 , -6/3 = -2 ,
-7/3 = -3
А не -2.
Максим Николаевич
Не понял (. Почему -1/3=-1, разве не 0? И если -4/3=-2, разве не -1?
Странно, а у меня работает как то по другому, чем у выше написавших, по "математически". VS2015 c++.
int i = -1 / 3;
int j = -1 % 3;
даёт i == 0, j == -1;
int i = -1 / 3;
int j = -1 % 3;
даёт i == 0, j == -1;
Леонид Садкин
Ну он же написал:
"Математикам стоит обратить внимание на то, что деление и подсчёт остатка для отрицательных чисел работает в C++ «неправильно»
Что в С++ совсем не так, как математически.
"Математикам стоит обратить внимание на то, что деление и подсчёт остатка для отрицательных чисел работает в C++ «неправильно»
Что в С++ совсем не так, как математически.
Леонид Садкин
https://ru.wikipedia.org/wiki/Деление_с_остатком
-1 % 3 в С++ -1, что неверно, т. к. остаток по определению >= 0
-1 % 3 в С++ -1, что неверно, т. к. остаток по определению >= 0
Остаток должен быть положительным числом от 0 до (делитель - 1)
Учитывая это, корректно записать -7 = 3*(-3) + 2
то есть целочисленное деление -7 // 3 = 3,
остаток -7 % 3 = 2
Учитывая это, корректно записать -7 = 3*(-3) + 2
то есть целочисленное деление -7 // 3 = 3,
остаток -7 % 3 = 2
Похожие вопросы
- Деление отрицательного числа. Ассемблер
- При делении отрицательного числа выводит не правильный ответ (assembler). Если беру числа 127 13 10, пишет переполнение
- НА C# НАПИСАТЬ КОД Найти сумму целых отрицательных чисел, кратных 5 и принадлежащих интервалу [-20; 20].
- Как определить отрицательные числа?
- Число ноль это положительное или отрицательное число.
- Как в c++ сравнить несколько чисел
- За сколько тактов выполняются основные арифметические операции на современных компьютерах?
- Отрицательные числа и дополнительный код
- Дан целочисленный двумерный массив, размерности n х m. Заменить все отрицательные числа нулем
- Выполнить арифметические операции в двоичной системе счисления по алгоритмам, применяемым в ЭВМ