2012-07-11 14 views

Trả lời

3

Không có chức năng nào như vậy trong GMP. Chỉ trong MPFR.

5

Tôi biết bạn không hỏi làm thế nào để thực hiện nó, nhưng ...

Bạn có thể thực hiện một thô sử dụng các tính chất của logarit: http://gnumbers.blogspot.com.au/2011/10/logarithm-of-large-number-it-is-not.html

Và bên trong của thư viện GMP: https://gmplib.org/manual/Integer-Internals.html

Đây là triển khai của tôi cho Rational.

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; 
    } 
1

Ở đây là: https://github.com/linas/anant

Cung cấp mp gnu thực và phức tạp logarit, exp, sin, cosin, gamma, arctan, sqrt, polylogarithm Riemann và Hurwitz zeta, confluent hypergeometric, nhà topo sin, và hơn.

Các vấn đề liên quan