ПРЕДУПРЕЖДЕНИЕ
Выполнение этого фрагмента
изменяет содержимое регистра EAX.
|
Оценим погрешность приближения. Так как результат, получаемый как _Power(2,x) (функция _Power приведена в начале статьи), заведомо
точнее, чем Exp2(x), то в качестве оченки примем относительное отклонение
значения последней функции от значения первой: Epsilon=abs( Exp2(x) -
_Power(2,x) ) / _Power(2,x). Разумеется, выражение имеет смысл, если
_Power(2,x)<>0.
Если построить график относительной погрешности, становится видно, что в пределах каждого из 1998 отрезков он имеет форму кривой
с одним максимумом, сходящей к нулю на концах отрезка. При этом пределы
колебаний величины погрешности остаются постоянными на всех отрезках, кроме
нескольких последних – на них погрешность возрастает. Если не принимать во
внимание эти отрезки, и ограничить область допустимых значений аргумента числом
990 (т.е. x<990), то для описания поведения относительной погрешности в
зависимости от x достаточно показать ее график на двух последних допустимых для
значений x отрезках:
Рисунок 1. Максимальная погрешность приближения
функции Exp2=2**x (при x менее 990) не превышает 0,004%.
СОВЕТ
Мы отсекли отрезки, лежащие
правее точки x=990. Следовательно, размер таблицы коэффициентов можно
несколько сократить: индекс последнего элемента должен быть 990*2=1980, а не
1998. “Лишние” 19 последних строк таблицы можно просто удалить. Логично также
изменить текст комментария в начале функции Exp2.
|
Новый вариант функции возведения в степень
Изменим реализацию возведения в степень в соответствии
с предложенной аппроксимацией для 2**x: