2012-07-11 28 views

cevap

3

Hayır, GMP'de böyle bir işlev yok. Sadece MPFR'de. Ben bunu uygulamak, bunlarla nasıl sormadı biliyorum

5

...

Sen logaritma özelliklerini kullanarak kaba bir tane uygulayabilirsiniz: http://gnumbers.blogspot.com.au/2011/10/logarithm-of-large-number-it-is-not.html

Ve GMP kütüphanesinin iç görün: https://gmplib.org/manual/Integer-Internals.html

İşte Rationals için benim uygulamam. İşte

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

öyle: https://github.com/linas/anant

gnu mp reel ve kompleks logaritma, exp, sinüs, kosinüs, gama, arctan, sqrt polylogarithm Riemann ve Hurwitz zeta, birleşik hipergeometrik, sinüs topologists Sağlar ve Daha.

İlgili konular