Question

Is it a good practice to manually set numbers with large negative exponential like 1e-300 to zero to avoid underflow in Matlab?

If not how can we avoid harm of underflow when implementing functions like log(1+exp(x))?

Was it helpful?

Solution

Typically, you get trouble when adding very large and very small values, because this can lead to a high relative error. Get rid of this summation (1+exp(x)), it quickly runs out of the range of double values when x is large.

log(1+exp(x))
log(1+1/exp(x))*exp(x))
log(1+1/exp(x))+log(exp(x))
log(1+1/exp(x))+x

An alternative is the use of vpa:

log(1+exp(vpa(10^6)))

very slow, but you get a result with the configured precision.

I never saw a case where manually setting small values to zero was a good solution, typically comparing with a tolerance is better.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top