c ++标准库中是否有任何函数可以计算指数和的对数?如果没有,我应该如何编写自己的书?您有此Wiki文章中未提及的任何建议吗?
我特别担心加总会下溢。在这种情况下,您需要对绝对值较大的负数求幂。我正在使用c ++ 11。
(shuvro代码的C ++ 11变体,根据问题使用标准库。)
template <typename Iter>
std::iterator_traits<Iter>::value_type
log_sum_exp(Iter begin, Iter end)
{
using VT = std::iterator_traits<Iter>::value_type{};
if (begin==end) return VT{};
using std::exp;
using std::log;
auto max_elem = *std::max_element(begin, end);
auto sum = std::accumulate(begin, end, VT{},
[max_elem](VT a, VT b) { return a + exp(b - max_elem); });
return max_elem + log(sum);
}
该版本更为通用-只要具有相关的运算符,它就可以在任何类型的值,任何类型的容器中使用。特别是,它将使用std::exp
和,std::log
除非值类型具有其自身的重载。
为了真正强大地抵抗下溢,即使对于未知的数字类型,对值进行排序也可能会有所帮助。如果对输入进行排序,则第一个值将是max_elem
,因此第一个项sum
将exp(VT{0}
是VT{1}
。显然没有下溢。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句