exp(x)=∑n=0∞xnn!=1+x+12x2+…
|x|≪1exp(x)≈1+xexp(x)−1|x|≪1
Bu kolayca python ile gösterilebilir:
>>> from math import (exp, expm1)
>>> x = 1e-8
>>> exp(x) - 1
9.99999993922529e-09
>>> expm1(x)
1.0000000050000001e-08
>>> x = 1e-22
>>> exp(x) - 1
0.0
>>> expm1(x)
1e-22
exp(10−8)−1exp(10−22)−1=0.000000010000000050000000166666667083333334166666668…=0.000000000000000000000100000000000000000000005000000…
Genel olarak "doğru" bir uygulama en fazla 1ULP'dan (yani son yerin bir birimi) uygulanmasından ibarettir exp
ve expm1
doğru olmalıdır. Bununla birlikte, bu doğruluğa ulaşmak "yavaş" kodla sonuçlandığından, bazen hızlı, daha az doğru bir uygulama mevcuttur. Örneğin, CUDA’da biz expf
ve hızlı expm1f
nerede duruyoruz f
. Göre CUDA C, app kılavuzu programlama. Dexpf
2ULP bir hata vardır.
Birkaç ULPS sırasındaki hataları umursamıyorsanız, genellikle üstel fonksiyonun farklı uygulamaları eşdeğerdir, ancak böceklerin bir yere gizlenebileceğine dikkat edin ... ( Pentium FDIV hatasını hatırlayın ?)
expm1
exp(x)−1xxexpm1
>>> exp(200)-1 == exp(200) == expm1(200)
True
1exp(200)
log
log1p
log(1+x)≈x|x|≪1
log1p
(özellikle nasıl uygulandığı, yani tahmin etmemize gerek yoktur).