Я заметил только существование Math.fma(a, b, c)
в Java 9, которое вычисляет a*b + c
(для double
и float
значения).
Возвращает комбинированное добавление трех аргументов; то есть возвращает точный продукт первых двух аргументов, суммированных с третьим аргументом, а затем округленный один раз до ближайшего float. Округление выполняется с округлением до ближайшего режима округления. Напротив, если a * b + c оценивается как регулярное выражение с плавающей запятой, задействованы две ошибки округления, первая для операции умножения, вторая для операции сложения.
Итак, похоже, что улучшает точность, делая 1 округление вместо 2. Правильно ли это? Это обусловлено возможностями ЦП, или мы можем рассчитывать на это всегда?
Я предполагаю, что это может быть реализовано с использованием специальных инструкций CPU. Это так? И если да, можем ли мы ожидать преимуществ производительности? Мне интересно узнать о фактических преимуществах с текущими платформами/процессорами, а также о гипотетических будущих преимуществах.
Изменить (пытаясь сделать его немного менее широким): я не забочусь о очень подробных ответах: да/нет, чтобы несколько элементов, чтобы исправить/подтвердить мое понимание, плюс несколько указателей, было бы достаточно для меня, чтобы отметить ответ, как принято. Меня действительно интересуют как аспекты точности, так и производительности, и я думаю, что они идут вместе...