Питон целочисленное деление отрицательных чисел

Числовые типы, арифметические операции

На этом занятии мы поподробнее поговорим о представлении чисел и арифметических операциях над ними.

  • int – для целочисленных значений;
  • float – для вещественных;
  • complex – для комплексных.

Основные арифметические операции

Пока такого понимания чисел будет вполне достаточно. Следующим шагом, нам с вами нужно научиться делать арифметические операции над ними. Что это за операции? Базовыми из них являются, следующие:

Оператор Описание Приоритет
+ сложение 2
вычитание 2
* умножение 3
/, // деление 3
% остаток деления 3
** возведение в степень 4

Давайте, я поясню их работу на конкретных примерах. Перейдем в консоль языка Python, чтобы выполнять команды в интерактивном режиме. Так будет удобнее для демонстрации возможностей вычислений. В самом простом варианте мы можем просто сложить два целых числа:

Получим результат 5. Но этот результат у нас нигде не сохраняется. Чтобы иметь возможность делать какие-либо действия с пятеркой, ее следует сохранить через переменную, например, вот так:

Теперь a ссылается на объект с числом 5. Давайте разберемся, как работает эта строчка. Сначала в Python создаются два объекта со значениями 2 и 3. Оператор сложения берет эти значения, складывает их и формирует третий объект со значением 5. А, затем, через оператор присваивания, этот объект связывается с переменной a. В конце, если на объекты 2 и 3 не ссылаются никакие другие переменные, они автоматически удаляются из памяти сборщиком мусора. Возможно, вас удивило, что при такой простой операции сложения двух чисел выполняется столько шагов. Но в Python реализовано все именно так. И это справедливо для всех арифметических операций. Мало того, раз операция сложения возвращает объект с результатом, то можно сделать и такое сложение из трех чисел:

И так далее, можно записать сколько угодно операций сложения в цепочку. Давайте теперь сложим целое число с вещественным:

Очевидно, что результат получается тоже вещественным. Отсюда можно сделать вывод, что сложение целого числа с вещественным всегда дает вещественное значение. А вот при делении двух любых чисел, мы всегда будем получать вещественное число (даже если числа можно разделить нацело):

Если же нам нужно выполнить деление с округлением к наименьшему целому, то это делается через оператор:

На выходе получаем значение 3, так как оно является наименьшим целым по отношению к 3,5. Обратите внимание, что при делении отрицательных чисел:

получим уже значение -4, так как оно наименьшее по отношению к -3,5. Вот этот момент следует иметь в виду, применяя данный оператор деления. Следующий оператор умножения работает очевидным образом:

Обратите внимание, в последней операции получим вещественное значение 9.0, а не целое 9, так как при умножении целого на вещественное получается вещественное число. Давайте теперь предположим, что мы хотим вычислить целый остаток от деления. Что это вообще такое? Например, если делить 10 : 3 то остаток будет равен 1. Почему так? Все просто, число 3 трижды входит в число 10 и остается значение 10 — 3∙3 = 1. Для вычисления этого значения в Python используется оператор:

Читайте также:  Python encode utf 8 errors

то получим 2. Я думаю, общий принцип понятен. Здесь есть только один нюанс, при использовании отрицательных чисел. Давайте рассмотрим четыре возможные ситуации:

9 % 5 # значение 4 -9 % 5 # значение 1 9 % -5 # значение -1 -9 % -5 # значение -4

Почему получаются такие значения? Первое, я думаю, понятно. Здесь 5 один раз входит в 9 и остается еще 4. При вычислении -9 % 5 по правилам математики следует взять наименьшее целое, делящееся на 5. Здесь – это значение -10. А, далее, как и прежде, вычисляем разность между наименьшим, кратным 5 и -9: -9 – (-10) = 1 При вычислении 9 % -5, когда делитель отрицательное число, следует выбирать наибольшее целое, кратное 5. Это значение 10. А, далее, также вычисляется разность: 9 – 10 = -1 В последнем варианте -9 % -5 следует снова выбирать наибольшее целое (так как делитель отрицателен), получаем -5, а затем, вычислить разность: -9 – (-5) = -4 Как видите, в целом, все просто, только нужно запомнить и знать эти правила. Кстати, они вам в дальнейшем пригодятся на курсе математики. Последняя арифметическая операция – это возведение в степень. Она работает просто:

2 ** 3 # возведение в куб 36 ** 0.5 # 36 в степени 1/2 (корень квадратный) 2 ** 3 ** 2 # 2^3^2 = 512

В последней строчке сначала 3 возводится в квадрат (получаем 9), а затем, 2 возводится в степень 9, получаем 512. То есть, оператор возведения в степень выполняется справа-налево. Тогда как все остальные арифметические операции – слева-направо.

Приоритеты арифметических операций

Получим значение 9. Почему так произошло? Ведь кубический корень из 27 – это 3, а не 9? Все дело в приоритете арифметических операций (проще говоря, в последовательности их выполнения). Приоритет у оператора возведения в степень ** — наибольший. Поэтому здесь сначала 27 возводится в степень 1, а затем, 27 делится на 3. Получаем искомое значение 9. Если нам нужно изменить порядок вычисления, то есть, приоритеты, то следует использовать круглые скобки:

Теперь видим значение 3. То есть, по правилам математики, сначала производятся вычисления в круглых скобках, а затем, все остальное в порядке приоритетов. Приведу еще один пример, чтобы все было понятно:

То есть, приоритеты работают так, как нас учили на школьных уроках математики. Я думаю, здесь все должно быть понятно. Также не забывайте, что все арифметические операторы выполняются слева-направо (кроме оператора возведения в степень), поэтому в строчке:

Дополнительные арифметические операторы

В заключение этого занятия рассмотрим некоторые дополнения к арифметическим операторам. Предположим, что у нас имеются переменные:

И, далее, мы хотим переменную i увеличить на 1, а j – уменьшить на 2. Используя существующие знания, это можно сделать, следующим образом:

Результат будет прежним, но запись короче. Часто, в таких ситуациях на практике используют именно такие сокращенные операторы. То же самое можно делать и с умножением, делением:

Источник

Как работают операции // и % в Python для отрицательных чисел?

Я ожидал само-собой разумеющегося результата для выражений 10//3 и 10%3 : получил 3 и 1 соответственно.
Но когда сделал то же самое для отрицательного 10, получил неожиданно «странный» результат:
— 10//3 == — 4
— 10%3 == 2
Попробовав divmod(10, 3) и divmod(-10, 3) получил тот же результат, что естественно.
Выходит, что результат работы операторов целочисленного деления и деления по модулю в Python для отрицательных чисел подчиняется совершенно не классическим математическим законам, а рассчитывается по какой-то своей зависимости-функции.
Действительно, в математике 10//3 и -10//3 будет отличаться лишь знаком (3 и -3).
help(divmod) объясняет, что результат divmod(x, y) подчиняется такому закону div*y + mod == x.
Хотелось бы понять, как в Python можно быстро понять (посчитать в «уме») результат операции x//y и x%y при отрицательных значениях (для положительных считается легко и привычно)?
И чем обоснована такая зависимость в Python для этих операций, а не «классическая» математическая?

Читайте также:  Как найти userchrome css

Простой 1 комментарий

chupasaurus

Вы явно не дипломированный математик, чтобы утверждать.
Формулу того, как работает деление с остатком, вы правильно процитировали, а куда округлять — это вопрос соглашений (вики с тем как это работает).

Я могу поспорить с Вами, но лучше попробую объяснить на примерах, что не всё так «очевидно», как Вы меня представили )))
Итак, Вы хотите сказать, что в математике :
(-10) «целочисленно разделить на» (3) равен (-4) ?
Я всегда думал, что -10 div 3 равно в математике -3.
———
Допустим, я не знаю математику..
Тогда на Си результат -10 div 3 будет -3 -1 ( Результат нижеприведенного кода: Quotient and remainder: -3 -1 )
#include stdio.h
#include stdlib.h
int main(void)
div_t n;
n = div(-10,3);
printf(«Quotient and remainder: %d %d\n», n.quot, n.rem);
return 0;
>

На старом Pascal результатом -10 целочисленно разделить на 3 будет так же (-3)
var result : integer;
begin
result := -10 div 3;
writeln(‘Result = ‘, result);
end.

Почему же на Python результат ( -4 ) ? — нет, понятно, что считается он соответственно своего какого-то закона. Но как это быстро в голове посчитать согласно той формуле, что указана была мной выше?
И на каком основании это деление считается в Питоне вот так а не «как обычно»?

vohman, Спорить, конечно, можете, только смысла нет. Я математик, и не просто математик, а со специализацией «теория чисел».

Берёте любую книжку по элементарной теории чисел и читаете определение остатка и неполного частного (обычно это параллельно формулировке соответствующей теоремы делается). Можно найти и в более общего характера книжках (по алгебре, например, где часто излагаются и основы теории чисел; например, в «Лекциях по алгебре Д.К.Фаддеева»). По поводу неправильной реализации в ЯП — это к их авторам (или авторам компиляторов, не знаю, кто там виноват).

Ваш ответ, к сожалению, не верен — математику я знаю, но не профессор )))
А результат в математике и в других я зыках явно отличается от Питоновского

Читайте стр. 8 (теорема 3) Д.К.Фаддеев, «Лекции по алгебре». М.: Наука, 1984.

Я, конечно же, не дипломированный математик :)) как мне написали, но школьную математику я еще осилю ))
По поводу округления и в какую сторону — этого нет в понятии целочисленного деления в математике, да и вроде как в Питоне для не отрицательных чисел такое округление не делается.
К тому же -10/3 = -3.33333333. и округление (раз мне предлагают им воспользоваться) будет в сторону -3 — это в математике. И так поступают в основном в других языках.

Читайте также:  Php check body class

Выходит, что в математике :
(-10) «целочисленно разделить на» (3) равен (-4) ?
Я всегда думал, что -10 div 3 равно в математике -3.
———
Допустим, я не знаю математику..
Тогда на Си результат -10 div 3 будет -3 -1 ( Результат нижеприведенного кода: Quotient and remainder: -3 -1 )
#include stdio.h
#include stdlib.h
int main(void)
div_t n;
n = div(-10,3);
printf(«Quotient and remainder: %d %d\n», n.quot, n.rem);
return 0;
>

На старом Pascal результатом -10 целочисленно разделить на 3 будет так же (-3)
var result : integer;
begin
result := -10 div 3;
writeln(‘Result = ‘, result);
end.

Почему же на Python результат ( -4 ) ? — нет, понятно, что считается он соответственно своего какого-то закона. Но как это быстро в голове посчитать согласно той формуле, что указана была мной выше?
И на каком основании это деление считается в Питоне вот так а не «как обычно»?

Источник

# Особенности операций целочисленного деления и взятия остатка при работе с отрицательными числами

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

При этом чтобы вышеприведенная формула всегда оставалась верна то изменяется и работа оператора целочисленного деления. Аналогично два варианта:

# Delphi

Рассмотрим пример на Delphi, сначала остаток

Writeln('mod'); Writeln('-7 mod 3 = ', -7 mod 3); // -1 Writeln('-7 mod -3 = ', -7 mod -3); // -1 Writeln('7 mod -3 = ', 7 mod -3); // 1 

Mod в Pascal

Знак остатка всегда равен знаку делимого. Теперь целочисленное деление

Writeln(''); Writeln('div'); Writeln('-7 div 3 = ', -7 div 3); // -2 Writeln('7 div -3 = ', 7 div -3); // -2 Writeln('-7 div -3 = ', -7 div -3); // 2 

Div в Pascal

Знак как и при обычном делении — отрицательный только если аргументы имеют разный знак. Округление в сторону 0.

Пример такого округления -7 делим на 3, получаем -2 1/3. Можно округлить до -3 или до -2. -2 ближе к нулю, поэтому округляем до -2. Так как -2 * 3 = -6, то остаток должен быть равен -7 — (-6) = -1

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

# Python

Рассмотрим пример на Python

print(‘-7 % 3 =’, -7 % 3) # 2 print(‘-7 % -3 =’, -7 % -3) # -1 print(‘7 % -3 =’, 7 % -3) # -2

Остаток от деления в Python

Знак остатка всегда равен знаку делителя. Причем в разных ситуациях результат отличается еще и по модулю.

print() print(‘-7 // 3 =’, -7 // 3) # -3 print(‘-7 // -3 =’, -7 // -3) # 2 print(‘7 // -3 =’, 7 // -3) # -3

Целочисленное деление в Python

Знак как и при обычном делании — отрицательный только если аргументы имеют разный знак. Округление в сторону -бесконечности. Пример такого округления 7 делим на -3, получаем -2 1/3. Можно округлить до -3 или до -2. -3 ближе к -бесконечности, поэтому округляем до -3.

Так как -3 * -3 = 9, то остаток должен быть равен 7 — 9 = -2

Источник

Оцените статью