C++ 计算日志(x-y)给定日志(x)和日志(y),是否没有溢出?

C++ 计算日志(x-y)给定日志(x)和日志(y),是否没有溢出?,c++,floating-point,numeric,logarithm,C++,Floating Point,Numeric,Logarithm,以下函数计算log(x+y)给定log(x)和log(y)的值,如果x或y非常大或非常小,则避免溢出或下溢: double log_add(double logx, double logy) { return max(logx, logy) + log1p(exp(-fabs(logx - logy))); } 必须有一个类似的log\u sub函数来计算log(x-y)。这是什么 更一般地说,我需要计算给定的log(x),log(y)和log(z)。从log\u add和log\u

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

double log_add(double logx, double logy)
{
    return max(logx, logy) + log1p(exp(-fabs(logx - logy)));
}
必须有一个类似的
log\u sub
函数来计算
log(x-y)
。这是什么


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

为什么不直接从以下步骤开始计算呢:

针对您的具体情况:

// 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));
}

@LưuVĩnhPhúc不。您正在否定
y
的对数,而不是
y
本身。oops误读了值是日志的原因是存在对
exp()
的调用,在我看来,代码确实存在溢出风险。例如,
logy=708
logx=-3
,将在IEEE-754双精度算法中导致溢出。@njuffa我只是提供标识:)这些就是它们。有关log1pexp的详细信息,请参阅不幸的是,CRAN目前似乎处于关闭状态,请尝试@njuffa,我假定此代码是打算用logx>logy调用的,但在这种情况下,我们很有可能遇到下溢:)
// 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));
}