Python Glossary English

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Сообщить о неточности