Создание
float соответствует типу double (IEEE 754, 64 бита):
a = 3.14b = 1e-3c = float("2.5")d = float("inf")e = float("-inf")f = float("nan")print(float(3))Неточность представления
Многие десятичные дроби не представимы в двоичном виде точно:
print(0.1 + 0.2)print(0.1 + 0.2 == 0.3)Сравнивать числа с плавающей точкой следует с допуском:
import mathprint(math.isclose(0.1 + 0.2, 0.3))print(math.isclose(1.0, 1.001, rel_tol=1e-2))Специальные значения
import mathinf = float("inf")nan = float("nan")print(inf > 10 ** 100)print(nan == nan)print(math.isnan(nan))print(math.isinf(inf))print(math.isfinite(1.5))nan не равно даже самому себе, поэтому проверять его нужно через math.isnan.
Методы float
| Метод | Описание |
|---|---|
is_integer() | Равно ли число целому |
as_integer_ratio() | Точная дробь (числитель, знаменатель) |
hex() | Шестнадцатеричное представление |
fromhex(s) | Классовый метод: число из hex() |
conjugate() | Само число |
real, imag | Действительная и мнимая части |
print((2.0).is_integer())print((2.5).is_integer())print((0.75).as_integer_ratio())print((0.1).as_integer_ratio())print((1.5).hex())Округление
x = 2.675print(round(x))print(round(x, 2))print(round(2.5))print(round(3.5))round использует банковское округление: половины округляются к ближайшему чётному. Результат round(2.675, 2) равен 2.67 из-за неточного представления числа.
import mathprint(math.floor(-2.5))print(math.ceil(-2.5))print(math.trunc(-2.5))print(int(-2.5))Результат: -3, -2, -2, -2.
Форматирование
x = 1234.56789print(f"{x:.2f}")print(f"{x:10.3f}")print(f"{x:e}")print(f"{x:,.1f}")print(f"{0.256:.1%}")print(f"{x:g}")Математические функции
| Функция | Описание |
|---|---|
math.sqrt(x) | Квадратный корень |
math.pow(x, y) | Степень, всегда float |
math.exp(x), math.log(x, base) | Экспонента и логарифм |
math.log2(x), math.log10(x) | Логарифмы по основаниям 2 и 10 |
math.sin, math.cos, math.tan | Тригонометрия, аргумент в радианах |
math.atan2(y, x) | Угол по координатам |
math.degrees, math.radians | Перевод между градусами и радианами |
math.hypot(*coords) | Евклидова норма |
math.fsum(iterable) | Точное суммирование |
math.pi, math.e, math.tau | Константы |
import mathprint(sum([0.1] * 10))print(math.fsum([0.1] * 10))print(math.hypot(3, 4))Результат: 0.9999999999999999, 1.0, 5.0.
Предел точности
import sysprint(sys.float_info.max)print(sys.float_info.epsilon)print(sys.float_info.dig)Для финансовых вычислений используйте decimal.Decimal или fractions.Fraction.
Задания
- Напишите функцию сравнения двух чисел с заданной точностью без
math.isclose. - Выведите число
1 / 3с двадцатью знаками и объясните результат. - Просуммируйте
0.1сто раз обычным способом и черезmath.fsum, сравните результаты.
