Модуль math (часть 1)

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Смотреть материал на YouTube | RuTube

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

Подключить этот модуль можно простой командой:

import math

После чего в пространстве имен math будут доступны все его константы и функции. Констант всего несколько и они следующие:

math.pi  # 3.141592653589793
math.e  # 2.718281828459045
math.tau  # 6.283185307179586
math.inf  # inf (бесконечность)
math.nan  # nan (Not a Number – не число)

Здесь точность констант pi, e, tau ограничена только точностью представления вещественных чисел типа float в интерпретаторе языка Python. Константы inf и nan принимают специальные, встроенные значения. Первую можно использовать, например, для указания бесконечных границ:

a, b = 0, math.inf  # [0; +oo)
a, b = -math.inf, 10  # (-oo; 10]

Соответственно, при проверке любое число будет меньше inf и больше -inf:

x = 7
x < math.inf  # True
x < -math.inf  # False

Поэтому, например, проверка:

a <= x <=# True

позволяет определять попадание числа x в диапазон (-oo; 10]. Причем, если к бесконечности прибавлять, вычитать, или бесконечность умножать и делить на какие-либо конечные числа, то все равно будет возвращаться бесконечность:

a, b = math.inf, -math.inf
a / 1000000  # inf
b + 10 ** 100  # -inf

То есть, в арифметических операциях бесконечность всегда остается бесконечностью.

В ряде случаев важно знать, присутствует ли в переменной значение inf или nan. Для этого можно воспользоваться следующими функциями модуля math:

a, b, c = -100, math.inf, math.nan
math.isfinite(a)  # True
math.isfinite(b)  # False
math.isinf(b)  # True
math.isnan(b)  # False
math.isnan(c)  # True

Функции округления и некоторых вычислений

Конечно, когда используется модуль math, то чаще всего его подключают для применения различных математических функций. Именно их мы с вами далее и будем рассматривать. Начнем с функций округления вещественных чисел и некоторых вычислительных. Они следующие:

Функция

Описание

ceil(x)

округление до наибольшего целого

floor(x)

округление до наименьшего целого

trunc(x)

отбрасывание дробной части

fabs(x)

возвращает модуль вещественного числа

fma(x, y, z)

выполняет вычисления по формуле: (x * y) + z; появилась в Python 3.13

fmod(x, y)

возвращает остаток от деления x % y

modf(x)

возвращает кортеж с дробной и целой частями числа

Применяются очевидным образом:

a, b = -5.6473, 7.2353
math.ceil(a)  # -5
math.ceil(b)  # 8
math.floor(a)  # -6
math.floor(b)  # 7
math.trunc(a)  # -5

Обратите внимание на способы вычислений положительных и отрицательных чисел. Наибольшее для положительного 7.2353 – это 8, а наибольшее для -5.6473 – это -5. То же самое с наименьшими значениями.

Остальные функции этого блока:

math.fabs(a)  # 5.6473
math.fma(a, b, 2)  # -38.85990969
math.fmod(13, 5)  # 13 % 5 = 3
math.modf(a)  # (-0.6473000000000004, -5.0)
math.modf(b)  # (0.23529999999999962, 7.0)

У вас здесь может возникнуть вопрос, для чего продублирована функция fmod(), которая эквивалентна стандартной операции % – вычисления остатка от деления? Дело в том, она может давать более точные результаты при использовании вещественных чисел, в сравнении с операцией %. Это связано с тем, что некоторые вещественные числа в памяти компьютера не могут быть описаны точно. Классический пример – сумма чисел 0.1 и 0.2:

0.1 + 0.2 = 0.30000000000000004

Функция fmod() при вычислениях старается минимизировать такие погрешности.

Функции манипулирования с вещественными числами

Следующий блок функций содержит функции обработки вещественных чисел:

Функция

Описание

copysign(x, y)

присвоение знака числа y модулю числа x

frexp(x)

возвращает кортеж из мантиссы и экспоненты числа x

ldexp(m, e)

формирование вещественного числа x по его мантиссе m и экспоненте e согласно формуле: x = m * 2 ** e

isclose(a, b, rel_tol, abs_tol)

выполняет проверку близости вещественных чисел a, b с погрешностью rel_tol

Например:

a, b = -5.6473, 7.2353
math.copysign(a, b)  # 5.6473
math.copysign(a, -2)  # -5.6473
math.frexp(b)  # (0.9044125, 3)

Исходное значение b на основе мантиссы m=0.9044125 и экспоненты e=3 строится по формуле:

b = m * 2 ** e

Эта формула реализуется функцией ldexp():

m, e = math.frexp(b)
x = math.ldexp(m, e)  # 7.2353

Последняя функция isclose() этого блока выполняет проверку близости двух вещественных чисел по формуле:

abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

Фактически параметр rel_tol здесь позволяет задавать степень близости между величинами a, b (по умолчанию rel_tol= le-09), а параметр abs_tol – задает максимальное абсолютное рассогласование между a, b (по умолчанию abs_tol=0). При сравнении выбирается наибольшее: либо степень близости, либо абсолютное рассогласование.

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

x, y = 2.3, 2.31

тогда:

math.isclose(x, y, rel_tol=0.01)  # True (погрешность 1%)
math.isclose(x, y, rel_tol=0.001)  # False (погрешность 0.1%)
math.isclose(x, y, rel_tol=0.004)  # False (погрешность 0.4%)
math.isclose(x, y, rel_tol=0.0044)  # True (погрешность 0.44%)

Как видите, разные значения погрешности точно улавливают рассогласования между величинами x, y. Давайте теперь протестируем второй именованный параметр этой функции:

math.isclose(x, y, rel_tol=0.001, abs_tol=0.002)  # False
math.isclose(x, y, rel_tol=0.001, abs_tol=0.02)  # True

В последних двух командах параметр abs_tol был больше заданной степени близости чисел с rel_tol=0.001, поэтому сравнение x, y выполнялось по непревышению величины abs_tol. В первом случае она была слишком мала, чтобы x, y считать близкими, а во втором случае достаточной, чтобы x, y полагались близкими друг другу.

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Видео по теме