Поскольку это CS, а не Stackoverflow, я собираюсь предположить, что вы задаете вопрос о числовом анализе, и (для простоты), в частности, IEEE-754 с плавающей запятой. В этом случае ответ на ваш вопрос частично зависит от того, что вы подразумеваете под «проще», и частично от деталей системы.
Ни один из современных процессоров, о которых я знаю, не имеет встроенной инструкции, которая делает именно то, что вы ожидаете, либо для операции (которую отныне мы будем называть , ее обычное имя в C), либо для ( ). Они оба реализованы с использованием библиотечных функций.2 хеИксexp
2xexp2
Как и в случае со всеми числовыми методами для трансцендентных операций, следует рассмотреть несколько особых случаев:
exp(NaN) = NaN
exp(+Inf) = +Inf
exp(-Inf) = 0
Однако есть еще одна вещь, которая делает задачу несколько менее сложной: полезный домен довольно мал. Для двоичного 32: переполнение, exp(x)
если или около того, и переполнение, если или около того. Необычно для трансцендентных операций, мы также можем игнорировать субнормальный случай, так как он неотличим от if субнормальный. Все вышеперечисленное также верно, за исключением того, что домен немного отличается.x<−104x>88.7exp(x)
1.0
x
exp2
Ваша интуиция права в том, что большинство реализаций вычисляют . Однако стоимость этого умножения на тривиальна по сравнению с остальными вычислениями . Типичный метод использует предварительно вычисленную таблицу с элементами:ex=2x/ln2 K1ln2exp2
K
exp2(x)=2n×T[j]×P(y)
где - целая часть , таблица содержит значения для всех в диапазоне , а - некоторое полиномиальное приближение к (четвертого достаточно для двоичного кода32) ) в диапазоне . Часть дешева, поскольку она просто манипулирует экспонентой. это таблица соответствия. Так что , вероятно, будет дорогой частью операции.x T 2 j / K j [ 0 , K ) P 2 x [ 0 , 1nxT2j/Kj[0,K)P2x2нТП[0,1K)2nTP
Для полноты следует отметить, что в процессорах Intel x86 FPU есть инструкция f2xm1
, которая вычисляет для в диапазоне . Однако на современном процессоре это довольно дорогая и не конвейерная инструкция, и вам не рекомендуется ее использовать. Как справедливо отмечает Раздел 3.8.5 Справочного руководства по оптимизации Intel :х [ - 1 , 1 ]2x−1x[−1,1]
Хотя x87 поддерживает трансцендентные инструкции, реализация трансцендентальной функции в библиотеке программного обеспечения может быть быстрее во многих случаях.
Изменить: в комментариях было указано, что я должен объяснить некоторые из новой терминологии, используемой в IEEE 754-2008. Некоторый язык изменился с 1985 и 1987 годов, и большинство людей гораздо лучше знакомы со старым жаргоном.
Термины «binary32» и «binary64» являются новыми именами для 32-разрядных и 64-разрядных двоичных чисел с плавающей запятой, которые старый стандарт называл «одинарными» и «двойными» соответственно.
Термин «субнормальное число» заменяет предыдущий термин «денормальное число» или «денормализованное число» .