Python 3.13+Числа и математикафункция
math.fma
произведение
Слитное умножение-сложение x·y + z за одно округление (Python 3.13+).
Синтаксис
math.fma(...)
Весь смысл в том, что промежуточное произведение не округляется: x*y + z округляет дважды и в длинных суммах копит ошибку, fma — один раз. Аргументы-int приводятся к float, результат всегда float, и в обычной арифметике разница невидима — за ней лезут только в численные алгоритмы вроде скалярного произведения или схемы Горнера.
Примеры
import math
# math.fma появилась в Python 3.13. На более ранних версиях того же результата
# в большинстве случаев даёт x*y+z — но НЕ всегда: смысл fma в том, что
# умножение и сложение выполняются с одним округлением вместо двух.
fma = getattr(math, 'fma', lambda x, y, z: float(x * y + z))
print(fma(2, 3, 4)) # → 10.0
print(fma(2.5, 4, -1)) # → 9.0
print(fma(0.5, 10, 3)) # → 8.0
print(type(fma(2, 3, 4))) # → <class 'float'>
import math
# Вот та самая разница в одном округлении. На 3.13+ она видна, на 3.12
# подстановка выше даёт ровно то же выражение, что и справа.
print(fma(0.1, 0.1, -0.01) <= 0.1 * 0.1 - 0.01) # → ? (аппаратный fma и порядок округления зависят от платформы)
print(hasattr(math, 'fma')) # → ? (появилась в Python 3.13)
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности