Boost C ++库中Log函数的问题

时间:2010-12-02 09:13:15

标签: c++ boost numbers numerical-methods logarithm

我有这个代码,以获得给定通用基数的数字的对数:

#include <boost/math/special_functions/powm1.hpp>
#include <boost/math/special_functions/log1p.hpp>
#include <boost/math/special_functions/sqrt1pm1.hpp>
// ...
// Boost Log returns boost::math::log1p(x) = log(e, x + 1)
double res = (double)(boost::math::log1p(arg - 1));
// Base conversion: log(new, y) = log(old, y) / log(old, new)
// Then ==> log(base, arg) = log(e, arg) / log(e, base)
res = (double)(res / ((double)boost::math::log1p(base - 1)));
return res;

正如您所看到的,引导库只定义了neperian日志,并且还有一种获取该日志的棘手方法,因为该lib返回给您的不是log(x)而是log(x + 1)。正如你所看到的那样,通过给出参数arg - 1来解决这个问题,一切都应该有效。

WELL它有效,但只有neperian日志可以,我的意思是,如果我运行此代码:

#include <boost/math/special_functions/powm1.hpp>
#include <boost/math/special_functions/log1p.hpp>
#include <boost/math/special_functions/sqrt1pm1.hpp>
// ...
// Boost Log returns boost::math::log1p(x) = log(e, x + 1)
double res = (double)(boost::math::log1p(arg - 1));
// Base conversion: log(new, y) = log(old, y) / log(old, new)
// Then ==> log(base, arg) = log(e, arg) / log(e, base)
//res = (double)(res / ((double)boost::math::log1p(base - 1)));
return res;

一切都很好,但是当我执行基础更改时一切都不好,我得到了错误的结果......我不知道,也许这是一个数学问题...我知道那个日志(basea,x )= log(baseb,x)/ log(baseb,basea)......

我在哪里做错了?

好吧,可能是关于数值稳定性的数学问题等等......要在不同的基础上记录,最佳实践是什么????????

2 个答案:

答案 0 :(得分:1)

我不确定究竟发生了什么,但你可能有一个四舍五入的问题。 1 + delta中delta变小的问题是没有建立双精度来保持delta的精确度,因为1极大地占主导地位并且delta被认为是无关紧要的。

升级库的目的是允许您分别传入1和delta,以便在获取日志时不会丢失增量的精度,这将为您提供接近0的数字。

一个例子是delta = 0.00000000123456789

如果你把它加到1然后再减去1,你就不会看到所有这些数字,因为双精度只能保持15个精度位置,但是高于+1的数字需要17,而我打印的数字仅使用9个位置,因为领先的零不算数。

答案 1 :(得分:0)

目前尚不清楚arg的类型是什么。你可以尝试一些事情

  1. 验证boost :: math :: log1p()打印出预期的结果。

  2. 验证arg - 1确实是双重打印出来的。相反,您尝试过:arg - 1.0