Что такое вещественные числа в python
Числа в Python
Для обработки данных, связанных с количественной информацией, а также для выполнения арифметических операций в языке программирования Python используются различные виды чисел: целые, вещественные и комплексные. Стандартная библиотека Python содержит массу полезных методов, позволяющих легко взаимодействовать с численными типами данных.
Целые числа
Самой простой и наиболее часто используемой разновидностью чисел в языке Python, как и во многих других средствах программирования является целочисленный тип данных. Для его представления используются цифровые значения, которые, как правило, присваиваются определенным переменным. Ниже обозначен пример задания целых чисел в программе, где создается целая переменная под именем i, а затем выводится на экран ее значение и тип:
Вещественные числа
Для того чтобы записать действительное число в Python есть числа с плавающей точкой. Работая в программе с подобными величинами, можно получать более точные данные при арифметических подсчетах. Чтобы инициализировать объект, который содержит вещественное число, необходимо присвоить ему значение, где целая и дробная части разделены символом точки. В данном примере показано создание переменной f:
Комплексные числа
В языке программирования Python также поддерживается работа с комплексными числами. Подобная информация представлена в виде пары значений: действительной и мнимой части, которые разделяются символом операции сложения. Также в завершении мнимой составной части комплексного числа обязательно должна стоять буква j. В следующем фрагменте кода демонстрируется создание комплексной переменной c и выводится вся информация о ней:
Можно получить действительную и мнимую часть чисел отдельно. Для этого следует использовать real и image:
Системы счисления
Помимо общепринятой десятичной системы счисления, Python поддерживает приведение цифровых данных к двоичному, восьмеричному и шестнадцатеричному представлению. Чтобы начать работать с подобными числами, необходимо инициализировать переменные при помощи констант, обладающих префиксами 0b, 0o и 0x соответственно выбранному типу. В программе ниже создаются и выводятся на экран данные в различных системах:
Приведение типов
Используя стандартные средства языка Python, можно достаточно легко менять типовую принадлежность практически любой переменной. Для этого существуют методы, такие как int, float, complex, bin, oct, hex. Три последние функции позволяют перевести число либо переменную в десятичную, восьмеричную и шестнадцатеричную систему соответственно. Следующий фрагмент кода демонстрирует работу всех шести вышеописанных методов:
Операции над числами
Манипуляции над числовыми значениями в языке программирования Python выполняются благодаря множеству различных операций, символьные обозначения которых, как правило, совпадают с аналогами из традиционной математики. Таким образом, можно прибавлять, отнимать, умножать, делить, находить остаток от деления и возводить в степень числовые значения любых разновидностей. Ознакомиться с основными типами операций, которые выполняются над цифровыми значениями, можно из следующей небольшой таблицы:
Операция | Назначение |
a + b | Сложение a и b |
a – b | Разница между a и b |
a * b | Умножение a на b |
a / b | Деление a на b |
a % b | Остаток от деления a на b |
a // b | Целая часть от деления a и b |
a ** b | Возведение a в степень b |
Помимо вышеперечисленных арифметических действий, над числами можно осуществлять битовые операции, которые задействуют их двоичное представление. Перечень подобных операций представлен в следующей таблице, где можно найти назначение каждой из них:
Операция | Назначение |
a & b | Побитовое И для a и b |
a | b | Побитовое ИЛИ для a и b |
a ^ b | Исключающее ИЛИ для a и b |
Инверсия битов для a | |
a > b | Побитовый сдвиг вправо для a на b |
Метод | Назначение |
sqrt(a) | Квадратный корень из a |
log(a) | Натуральный логарифм из a |
fabs(a) | Возвращает модуль a |
round(a) | Округляет a до ближайшего целого |
round(a, b) | Округляет a до b знаков после точки |
floor(a) | Округляет a до меньшего целого значения |
ceil(a) | Округляет a до большего целого значения |
isfinite(a) | Проверяет, является ли a числом |
modf(a) | Возвращает целую и дробную части a |
sin(a) | Синус угла a, указанного в радианах |
cos(a) | Косинус угла a, указанного в радианах |
tan(a) | Тангенс угла a, указанного в радианах |
Функция fabs модуля math вначале пытается привести аргумент к вещественному типу (float), и только потом вычисляет модуль. Для вычисления модуля числа так же есть стандартная функция abs.
Ввод числа с клавиатуры
Для того чтобы получить числовые данные от пользователя используется стандартный метод input. Его вызов позволяет получать ввод информации с клавиатуры, который выполняется во время запуска программы на компьютере. В качестве аргумента для этого метода можно использовать строку, предлагающую пользователю ввести числовые сведения. Ниже показан пример того, как ввести в Pyhon с клавиатуры число. Переменная n получает значение и отображается на экране с помощью print:
Максимальное значение
Получить максимальное значение целочисленной переменной, которое поддерживается в текущей версии языка Python можно с помощью переменной sys.maxsize. Как правило, на разных компьютерах это число совпадать не будет из-за разной архитектуры процессоров. На данный момент из Python были убраны любые ограничения, касающиеся размерности вводимых величин. Вывести на экран максимальное число в Python можно следующим образом:
Заключение
Для обработки числовых данных в языке программирования Python используются цифровые константы трех видов: целые, вещественные и комплексные. Стандартные математические операции над числами, как правило, выполняются при помощи набора общепринятых знаков сложения, вычитания, умножения и деления. Для выполнения специфических действий над числовыми величинами используются различные методы из стандартной библиотеки Python.
Числа: целые, вещественные, комплексные
Числа в Python 3: целые, вещественные, комплексные. Работа с числами и операции над ними.
Целые числа (int)
Числа в Python 3 ничем не отличаются от обычных чисел. Они поддерживают набор самых обычных математических операций:
Также нужно отметить, что целые числа в python 3, в отличие от многих других языков, поддерживают длинную арифметику (однако, это требует больше памяти).
Битовые операции
Над целыми числами также можно производить битовые операции
x | y | Побитовое или |
x ^ y | Побитовое исключающее или |
x & y | Побитовое и |
x > y | Битовый сдвиг вправо |
[1] | (1, 2) за исключением случаев, когда вам не важно, что произойдет в случае точного равенства, см. ниже |
Ниже я разъясняю оба этих правила.
2.6.9.2. Необходимость использования eps ¶
Как уже говорилось выше, компьютер не может хранить все цифры числа, он хранит только несколько первых значащих цифр. Поэтому, если, например, разделить 1 на 3, то получится не 0.33333… (бесконечно много цифр), а, например, 0.33333333 (только несколько первых цифр). Если потом умножить результат обратно на 3, то получится не ровно 1, а 0.99999999. (Аналогичный эффект есть на простых калькуляторах; на продвинутых калькуляторах он тоже есть, но проявляется сложнее.)
(Вы можете попробовать потестировать, правда ли, что (1/3)*3 равно 1, и обнаружить, что проверка if (1 / 3) * 3 == 1 выполняется. Да, тут повезло — опять-таки из-за двоичной системы получилось округление в правильную сторону. Но с другими числами это может не пройти, например, проверка if (1 / 49) * 49 == 1 не срабатывает.)
На самом деле все еще хуже: компьютер работает в двоичной системе счисления, поэтому даже числа, в которых в десятичной системе счисления имеют конечное число цифр, в компьютере могут представляться неточно. Поэтому, например, сравнение if 0.3 + 0.6 == 0.9 тоже не сработает: если сложить 0.3 и 0.6, то получится не ровно 0.9, а слегка отличающее число (0.899999 или 0.900001 и т.п.)
Действительно, напишите и запустите следующую программу:
и вы увидите, что она выводит Fail.
(Более того, print(0.3+0.6) выводит у меня 0.8999999999999999.)
Итак, погрешности, возникающие при любых вычислениях, — это основная проблема работы с вещественными числами. Поэтому если вам надо сравнить два вещественных числа, то надо учитывать, что, даже если на самом деле они должны быть равны, в программе они могут оказаться не равны.
Итак, именно поэтому получаем
(Первое правило будет дальше 🙂 )
2.6.9.3. Выбор eps ¶
(И вообще, конечно, вариантов много — подошло бы любое число, которое существенно меньше 1e-3 и существенно больше 1e-12. Вот это и есть «хорошая» ситуация, когда варианты «равны» и «не равны» разделены очень сильно. А если бы они не были бы так разделены, то весь фокус с eps не прошел бы. Это то, про что я писал немного выше.).
В частности, поэтому на олимпиадах очень не любят давать задачи, которые реально требуют вычислений с вещественными числами — никто, даже само жюри, не может быть уверено в том, что у них eps выбрано верно. Но иногда такие задачи все-таки дают, т.к. никуда не денешься.
И поэтому получаем
В частности, в будущем вы заметите, что во многих задачах, которые, казалось бы, подразумевают вещественные входные данные (например, задачи на геометрию), входные данные тем не менее обычно целочисленны. Это сделано именно для того, чтобы можно было написать решение полностью в целых числах, и не иметь проблем с погрешностью. (Не всегда такое решение возможно, и уж тем более не всегда оно простое, но тем не менее.) Поэтому если вы можете написать такое решение, лучше написать именно его.
2.6.10. Дополнительный материал. «Грубые» задачи: когда eps не нужно¶
Здесь мы сравниваем два вещественных числа, чтобы найти максимум из них. Казалось бы, в соответствии со сказанным выше, в сравнении нужен eps … но нет! Ведь если два числа на самом деле равны, то нам все равно, в какую из веток if мы попадем — обе ветки будут верными! Поэтому eps тут не нужен.
Так иногда бывает — когда вам все равно, в какую ветку if’а вы попадете, если два сравниваемых числа на самом деле равны между собой. В таком случае eps использовать не надо. Но каждый раз тщательно думайте: а правда ли все равно? Всегда лучше перестраховаться и написать eps (выше с eps тоже все работало бы), за исключением совсем уж простых случаев типа приведенного выше вычисления максимума.
Еще пример: считаем сумму положительных элементов массива
Еще пример, где уже eps необходим: определим, какое из двух чисел больше:
Вообще, тут полезно следующее понятие. Назовем задачу (или фрагмент кода) грубым, если ответ на задачу (или результат работы этого фрагмента) меняется не очень сильно (не скачком) при небольшом изменении входных данных, и негрубым в противоположном случае. (Понятие грубости пришло из физики.)
Тогда в задаче (фрагменте кода) eps нужен, если задача является негрубой: тогда существуют такие входные данные, которые вам важно отличить от очень близких им. Например, если надо определить, какое из двух чисел больше, то при входных данных «0.3 0.3» надо ответить «они равны», но при очень небольшом изменении входных данных, например, на «0.300001 0.3» ответ резко меняется: надо отвечать «первое больше».
Если же задача (или фрагмент кода) является грубым, то, скорее всего, в нем можно обойтись без eps : если вы чуть-чуть ошибетесь при вычислениях, ответ тоже изменится не очень сильно. Например, если вы вычисляете максимум из двух чисел, то на входных данных «0.3 0.3» ответ 0.3, а на входных данных «0.300001 0.3» ответ 0.300001, т.е. изменился не очень сильно.
Но, конечно, все приведенное выше рассуждение про грубые задачи — очень примерно, и в каждой задаче надо отдельно думать.
2.6.11. Примеры решения задач¶
Приведу несколько примеров задач, аналогичных тем, которые встречаются на олимпиадах и в моем курсе.
Маша наблюдает из дома за грозой. Она увидела молнию, а через \(T\) секунд услышала гром от молнии. Она знает, что в той стороне, где была молния, есть одинокое дерево, и боится, не попала ли молния в это дерево. Расстояние от Машиного дома до дерева равно \(L\) метров, скорость звука равна \(V\) метров в секунду, скорость света считаем бесконечной. Определите, могла ли молния попасть в дерево.
Пример:
Итоговый код получается такой:
Выбор eps тут в существенной мере произвольный, подробнее про выбор eps описано выше в основной части теории.
Пример:
- Что такое вещественные устные письменные
- Что такое вещественные числа в информатике