np.expm1
смягчает потерю значимости , которая происходит, когда берется разница между двумя почти равными числами (поскольку многие значимые места взаимно отменяют друг друга, результат будет иметь меньше значащих мест, чем может хранить тип данных).
1/(np.exp(-50)+1)==1.0
- это ограничение типа данных, а не алгоритма.floats
не может разрешить разницу с 1.0
, равную exp(-50)
.В самом деле, ближайшие значения с плавающей точкой слева и справа от 1.0
равны
>>> np.nextafter(1.0, 0.0)
0.9999999999999999
>>> np.nextafter(1.0, 2.0)
1.0000000000000002
, указывающим разрешение oom 10^-16
, нигде не достаточно хорошо, чтобы различать 1
и 1 +/- exp(-50)