通常,在添加非常大和非常小的值时会遇到麻烦,因为这会导致较高的相对误差。去掉这个求和 (1+exp(x)),当 x 很大时,它很快就会超出 double 值的范围。
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
另一种方法是使用 vpa:
log(1+exp(vpa(10^6)))
非常慢,但您会得到配置精度的结果。
我从未见过手动将小值设置为零的情况是一个好的解决方案,通常与容差相比更好。