c++ - 计算给定 log(x) 和 log(y) 的 log(x - y),没有溢出?

标签 c++ floating-point numeric logarithm

以下函数根据 log(x)log(y) 的值计算 log(x + y),避免溢出如果 xy 非常大或非常小,则下溢:

double log_add(double logx, double logy)
{
    return max(logx, logy) + log1p(exp(-fabs(logx - logy)));
}

必须有一个类似的log_sub 函数来计算log(x - y)。这是什么?

更一般地说,我需要计算 log(x - y - z) 给定 log(x)log(y)日志(z)。从 log_addlog_sub 我可以分两步计算 log(x - y - z),但也许有最佳方法?

最佳答案

为什么不直接从 identities 开始呢? :

double log_add(double logx, double logy) {
    return logx + log1p(exp(logy - logx));
}

double log_sub(double logx, double logy) {
    return logx + log1p(-exp(logy - logx));
}

针对您的具体情况:

// log(x - y - z) given the three logs
double log_xyz(double logx, double logy, double logz) {
    return logx + log1p(-exp(logy - logx) - exp(logz - logx));
}

关于c++ - 计算给定 log(x) 和 log(y) 的 log(x - y),没有溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29827309/

相关文章:

c++ - 从不同大小的整数获取到指针的警告转换

c++ - boost::sandbox::odeint 安装

r - 将因子转换为数字并删除级别

C++ 命名空间未声明但它是?

C++:通过 'extending?' 基实例/实现向下转换创建派生实例?

c - 为什么模数 (%) 运算符适用于 char 但不适用于浮点类型?

Excel 求解器和 VBA : Floating point/decimal numbers in constraints get incorrectly converted to integers?

java - 格式化数字打印输出异常

c++ - Visual Studio 2013 - 调试中的变量值窗口

math - float 学有问题吗?