Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Умножение, отношение и деление по модулю

Читайте также:
  1. I. Определение терминов.
  2. I. Определение экономической эффективности
  3. I.1.1. Определение границ системы.
  4. III Распределение часов курса по темам и видам работ
  5. IV отделение Шоу программа
  6. NURBS: Определение
  7. Q: Какое определение спиральной модели жизненного цикла ИС является верным

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

И опять позволю себе повториться - правила выполнения этих операций в Python не очень отличаются от тех, которые вам знакомые из школы. Единственный нюанс, который необходимо всегда учитывать, заключается в том, что тип операнда в значительной степени определяет то, как Python будет обрабатывать числа. Например, деление числа 10 на 4,0, как показано на рис. 3.7, дает ожидаемый результат - 2,5.

Рис. 3.7. Деление чисел

Но в случае, показанном на рис. 3.8, мы получаем абсолютно другой ответ.

Рис. 3.8. Еще один пример деления

Неспівпадання ответов объясняется тем, что в первом случае, указав десятичную кому (точку) в операнде 4.0, мы сообщили Python, что нам небезразличная информация об остатке деления после десятичной запятой. Во втором случае, опустив десятичную кому, мы явно указали Python, что нас интересует только целая часть числа. И Python любезно отбросил дробную часть числа (.5).

Таким образом, как и в случае с операциями складывания и вычитания, Python определяет формат результата по форматам переданных ему операндов. Поэтому следует внимательно относиться к типам операндов. Очень просто потерять десятичную кому там, где в действительности вы ожидаете ее увидеть. Такая потеря в дальнейшем может привести к неправильной работе программы.

Но легкость, с которой при делении можно получить неожиданный или даже неправильный результат, была и остается темой жарких дебатов, которые ведутся и до этого дня среди участников телеконференций по тематике программирования на Python. Некоторые респонденты доводят необходимость применения специального оператора, отличающегося от обычного оператора деления (/), какой бы указывал Python, что требуется выполнить целочисленное деление (как показано на рис. 3.8), или наоборот, что устанавливает для результата формат числа с плавающей запятой (рис. 3.7). Так, как специальные операторы деления предлагалось использовать сочетание символов /. для деления только с плавающей запятой и сочетания // - только для целочисленного деления. Но эти предложения не нашли поддержки у автора языка, хотя он обещал подумать над этим вопросом и внести некоторые изменения в будущие версии Python.

Как и в случаях со складыванием и с вычитанием, длинные целые числа можно использовать в выражениях умножения и деления (рис. 3.9).

Рис. 3.9. Деление и умножение длинных чисел

Обратите внимание, что в третьем примере, показанном на рис. 3.9, используется новый оператор, обозначенный символом %, - деление по модулю. В отличие от операции целочисленного деления, которое возвращает целую часть от деления, эта операция возвращает остаток от целочисленного деления.

С помощью этого оператора можно осуществлять деление обычных или длинных целых чисел, причем от полученного результата отбрасывается целая часть числа (часть), а остаток возвращается. Например, выражение 136656000L % 13 повернет нуль, потому что число 136 656 000 делящееся на 13 без остатка.

Существует специальная функция, которую можно использовать для возвращения части и остатка от деления заодно. Функция divmod(x, y) возвращает результаты выполнения двух действий: х / в и х % у. Вы можете проверить это, введя команду

>>> print divmod (53,13)

(4, 1)

>>>

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

Округление, функции floor() и ceil()

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

Компьютеры оперируют с числами только в двоичном формате, то есть с основой 2. В числах с основой 2 присутствует только две цифры - 0 и 1. Это идеальная система исчисления для компьютеров, поскольку значение 0 и 1 могут быть представлены простым двух-позиційним переключателем. Электролампочка, тумблер, електросхеми на лампах или транзисторах - все это примеры двухпозиционных переключателей.

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

Но это утверждение справедливо только для целых чисел. Все мінюється, стоит только вставить в число десятичную кому. Способы, с помощью которых в компьютерах осуществлялось представление чисел с плавающей запятой, исторически были разнообразными, сложными и достаточно противоречивыми. Только в течение последних нескольких лет появилось что-то похожее на стандарт представления чисел этого типу. Однако многие считают, что даже этот стандарт, IEEE - 64, полный ловушек и недостатков. К сожалению, чтобы полностью раскрыть эту увлекательную тему, понадобится написать отдельную книгу не меньшего объема, чем данная. Но вряд ли такая книга выйдет, поскольку найдется не много людей, которые проявили бы к ней интерес. Уж слишком этот специфический вопрос для узкого круга специалистов. Пока вполне достаточно будет сообщить вам, что проблем в этом вопросе множество, а их решение связано со значительными трудностями.

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

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

Рис. 3.11. Несколько примеров превращения типов

Превращения типов часто сопровождаются округлением значений. Иногда требуется округлить результат к большему значению, иногда - к меньшему. Для этого существуют специальные методы округления, которые позволяют контролировать эту операцию,: floor() и ceil().

Взвесим, что эти и целый ряд других операций (функций), находятся в специальном модуле с именем math. Там же находятся и наиболее употребляемые математические константы, например pi (3.141592..) и, чтобы ими воспользоваться, надо выполнить специальную операцию импортирования модуля из внешней памяті в память компютера, например

Рис. 3.12. Функции floor() и ceil()

Инструкция импортирования

from math import *

позволяет обращаться к членам модуля непосредственно, без указания имени модуля.

Существует и другая форма импорта, которая позволяет увидеть весь состав модуля,:

>>> import math

Нажмите на клавишу ENTER и наберите

>>> math.

((с точкой без нажатия ENTER).

В выпадающем списке вы увидите все, что входит в модуль math. Однако, чтобы вызывать число л (пи), нам пришлось бы вводить math.pi. Так же для обращения к функциям

floor() и ceil()

пришлось бы использовать вызовы

math.floor() и math.ceil().

Что удобнее, каждый программист решает в каждом конкретном случае сам.

На рис. 3.12 показано практически все, что необходимо знать для правильного использования функций округления и превращения типов. Только проверьте, чтобы количество открывающих круглых скобок отвечали количеству тех, которые закрывают. И еще на один момент хотелось бы обратить ваше внимание. Посмотрите, как функция long () принимает как аргумент другую функцию ceil (). Это важный момент, который необходимо хорошо запомнить,: вместо чисел как аргументов функций допускается использовать другие функции, которые обрабатывают свои аргументы.

Может возникнуть еще один вопрос, связанный с округлением чисел с плавающей запятой, - как будут округляться негативные числа? Мы ненадолго отложим обсуждение этого вопроса и вернемся к нему позже в этой главе.


Дата добавления: 2015-10-31; просмотров: 110 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Складывание и вычитание| Применение скобок

mybiblioteka.su - 2015-2024 год. (0.008 сек.)