Единственное, что я до сих пор нашел, это "безошибочные преобразования".Для любых чисел с плавающей запятой ошибки от a+b
, a-b
и a*b
также являются числами с плавающей запятой (в режиме округления до ближайшего, при условии отсутствия переполнения / недостаточного заполнения и т. Д.).
Добавление (и, очевидно, вычитание) ошибку легко вычислить;если abs(a) >= abs(b)
, ошибка точно равна b-((a+b)-a)
(2 флопа или 4-5, если мы не знаем, что больше).Ошибка умножения тривиальна для вычисления с fma
- это просто fma(a,b,-a*b)
.Без fma
это 16 флопов довольно неприятного кода.А полностью универсальная эмуляция правильно округленного fma
еще медленнее, чем это.
Дополнительные 16 флопов отслеживания ошибок на флоп реальных вычислений - это огромное излишество, но с 1-5 дружественными конвейеру флопами это довольноразумно и для многих алгоритмов, основанных на этих 50% -200% накладных расходов на отслеживание ошибок и компенсацию, приводит к таким малым ошибкам, как если бы все вычисления выполнялись с удвоенным числом битов, которое они избегали, во многих случаях избегая некорректных условий.
Интересно, что fma
никогда не используется в этих алгоритмах для вычисления результатов, просто для поиска ошибок, потому что обнаружение ошибки fma
является медленным, поскольку ошибка поиска умножения была без fma
.
Соответствующими ключевыми словами для поиска были бы «компенсированная схема Хорнера» и «продукт с компенсированной точкой», причем схема Хорнера принесла бы гораздо больше пользы.