Ponieważ jest to CS, a nie Stackoverflow, zakładam, że zadajesz pytanie dotyczące analizy numerycznej, a (dla uproszczenia) w szczególności zmiennoprzecinkowy IEEE-754. W takim przypadku odpowiedź na twoje pytanie częściowo zależy od tego, co rozumiesz przez „łatwiej”, a częściowo od szczegółów systemu.
Żaden współczesny procesor, o którym wiem, nie ma wbudowanej instrukcji, która wykonuje dokładnie to, czego można się spodziewać po operacji (którą odtąd nazywamy , jej zwykła nazwa w C) lub 2 x ( ). Oba są realizowane za pomocą funkcji bibliotecznych.mixexp
2)xexp2
Podobnie jak w przypadku wszystkich metod numerycznych operacji transcendentalnych, należy rozważyć kilka szczególnych przypadków:
exp(NaN) = NaN
exp(+Inf) = +Inf
exp(-Inf) = 0
Jest jednak jeszcze jedna rzecz, która sprawia, że problem jest nieco mniej skomplikowany: użyteczna domena jest dość mała. Dla binary32, exp(x)
niedomiarów jeśli lub więcej, przelewa jeśli x > 88,7 lub więcej. Nietypowo dla transcendentalnych operacji, możemy też ignorować sprawy słabszą od prawidłowej, ponieważ jest nie do odróżnienia od jeśli jest nienormalny. Wszystkie powyższe są również prawdziwe , z tą różnicą, że domena jest nieco inna.x < - 104x > 88,7exp(x)
1.0
x
exp2
Twoja intuicja jest słuszna, ponieważ większość implementacji oblicza . Jednak koszt tego pomnożenia przez jest trywialny w porównaniu z resztą komputerów . Typowa metoda wykorzystuje wstępnie obliczoną tabelę z elementami :mix= 2x / ln2) K.1ln2)exp2
K.
exp2 (x)= 2n× T[ j ] × P( y)
gdzie jest częścią całkowitą , tabela zawiera wartości dla wszystkich w zakresie , a jest pewną wielomianową aproksymacją dox T 2 j / K j [ 0 , K ) PnxT2j/Kj[0,K)P (kwartalna jest wystarczająca dla binarnego32) w zakresie [ 0 , 12x. 2nczęść jest tania, ponieważ jest to po prostu manipulowanie wykładnik. Tto tabela przeglądowa. Pjestwięcprawdopodobnie kosztowną częścią operacji.[0,1K)2nTP
Należy zwrócić uwagę na kompletność, że procesory Intel x86 zawierają instrukcję o nazwie f2xm1
, która oblicza dla x w zakresie [ - 1 , 1 ] . Jednak w przypadku nowoczesnego procesora jest to dość droga i niepotokowa instrukcja, dlatego bardzo odradzamy jej używanie. Jak słusznie odnotowano w podręczniku Intel Optimization Reference Manual, sekcja 3.8.5:2x−1x[−1,1]
Chociaż x87 obsługuje instrukcje transcendentalne, implementacja funkcji transcendentalnej w bibliotece oprogramowania może być szybsza w wielu przypadkach.
Edycja: W komentarzach wskazano, że powinienem wyjaśnić niektóre z nowych terminów stosowanych w IEEE 754-2008. Niektóre języki zmieniły się od 1985 i 1987 r., A większość ludzi jest znacznie bardziej zaznajomiona ze starym żargonem.
Terminy „binary32” i „binary64” to nowe nazwy 32-bitowych i 64-bitowych binarnych liczb zmiennoprzecinkowych, które stary standard nazywał odpowiednio „pojedynczym” i „podwójnym”.
Termin „liczba nienormalna” zastępuje poprzedni termin „liczba normalna” lub „liczba denormalizowana” .