Другие языки программирования и технологии

Особенности арифметических операций в C++, деление отрицательных чисел, вопрос ниже

"Математикам стоит обратить внимание на то, что деление и подсчёт остатка для отрицательных чисел работает в C++ «неправильно». Если в C++ мы разделим отрицательное число на положительное, например, посчитаем результат операции −7 / 3, то получим −2. Фактически в C++ отрицательное число берётся по модулю, делится, а затем к результату приписывается минус."
А в математике разве не так?
Для начала нужно понять, что деление с остатком, это не обычное деление с округлением до ближайшего целого числа.

Из вики : "Деление с остатком a («делимого») на b («делитель») означает нахождение таких целых чисел q(неполное частное) и r(остаток от деления), что выполняется равенство: a = b ⋅ q + r.

При делении с остатком отрицательного числа a = − 78 на b = 33 получаем неполное частное q = − 3 и остаток r = 21.
Проверка: − 78 = 33 ⋅ ( − 3 ) + 21."

Т. е. по сути, т. к. остаток мы должны прибавлять и он положителен, то и при положительном и при отрицательном делимом, мы должны округлять число до нижнего целого.
@@@tima @@@
@@@tima @@@
7 984
Лучший ответ
Максим Николаевич Да почитал вики и понял
На пальцах:
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.
Леонид Садкин
Леонид Садкин
27 070
Максим Николаевич Не понял (. Почему -1/3=-1, разве не 0? И если -4/3=-2, разве не -1?
Странно, а у меня работает как то по другому, чем у выше написавших, по "математически". VS2015 c++.

int i = -1 / 3;
int j = -1 % 3;

даёт i == 0, j == -1;
Borea Birtolan
Borea Birtolan
2 681
Леонид Садкин Ну он же написал:

"Математикам стоит обратить внимание на то, что деление и подсчёт остатка для отрицательных чисел работает в C++ «неправильно»

Что в С++ совсем не так, как математически.
Леонид Садкин https://ru.wikipedia.org/wiki/Деление_с_остатком

-1 % 3 в С++ -1, что неверно, т. к. остаток по определению >= 0
Остаток должен быть положительным числом от 0 до (делитель - 1)
Учитывая это, корректно записать -7 = 3*(-3) + 2
то есть целочисленное деление -7 // 3 = 3,
остаток -7 % 3 = 2