首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有GMP对数函数?

有没有GMP对数函数?
EN

Stack Overflow用户
提问于 2012-07-11 20:14:18
回答 4查看 4.6K关注 0票数 10

GMP库中是否实现了对数函数?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-11 20:16:43

不,GMP中没有这样的功能。仅在MPFR中。

票数 5
EN

Stack Overflow用户

发布于 2014-10-03 16:04:53

我知道你没有问如何实现它,但是...

您可以使用对数的属性实现一个粗略的对数:http://gnumbers.blogspot.com.au/2011/10/logarithm-of-large-number-it-is-not.html

和GMP库的内部结构:https://gmplib.org/manual/Integer-Internals.html

(编辑:基本上你只使用GMP表示法中最重要的“数字”,因为表示法的基数很大,B^NB^{N-1}大得多)

下面是我对有理函数的实现。

代码语言:javascript
复制
    double LogE(mpq_t m_op)
    {
        // log(a/b) = log(a) - log(b)
        // And if a is represented in base B as:
        // a = a_N B^N + a_{N-1} B^{N-1} + ... + a_0
        // => log(a) \approx log(a_N B^N)
        // = log(a_N) + N log(B)
        // where B is the base; ie: ULONG_MAX

        static double logB = log(ULONG_MAX);

        // Undefined logs (should probably return NAN in second case?)
        if (mpz_get_ui(mpq_numref(m_op)) == 0 || mpz_sgn(mpq_numref(m_op)) < 0)
            return -INFINITY;               

        // Log of numerator
        double lognum = log(mpq_numref(m_op)->_mp_d[abs(mpq_numref(m_op)->_mp_size) - 1]);
        lognum += (abs(mpq_numref(m_op)->_mp_size)-1) * logB;

        // Subtract log of denominator, if it exists
        if (abs(mpq_denref(m_op)->_mp_size) > 0)
        {
            lognum -= log(mpq_denref(m_op)->_mp_d[abs(mpq_denref(m_op)->_mp_size)-1]);
            lognum -= (abs(mpq_denref(m_op)->_mp_size)-1) * logB;
        }
        return lognum;
    }

(很久以后的编辑)5年后回到这里,我只是认为log(a) = N log(B) + log(a_N)的核心概念甚至在本机浮点实现中也出现了,这很酷,here是ia64的glibc版本,我在遇到this question后再次使用了它

票数 6
EN

Stack Overflow用户

发布于 2016-10-19 12:17:15

这就是:https://github.com/linas/anant

提供gnu mp实数和复数对数、exp、正弦、余弦、gamma、arctan、sqrt、多对数Riemann和Hurwitz zeta、合流超几何、拓扑学家正弦等。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11432436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档