10
votes

Y a-t-il une fonction de logarithme GMP?

existe-t-il une fonction de logarithme implémentée dans la bibliothèque GMP?


0 commentaires

4 Réponses :


3
votes

Non, il n'y a pas de cette fonction de ce type dans GMP. Seulement en MPFR.


1 commentaires

Vous êtes correct que la fonction de journalisation n'est pas explicitement donnée dans la bibliothèque GMP, mais on peut obtenir le journal à l'aide de mpz_get_d_2exp et exploitant les propriétés du logarithme.



5
votes

Je sais que vous n'avez pas demandé comment le mettre en œuvre, mais ...

Vous pouvez mettre en œuvre une rude en utilisant les propriétés de logarithmes: http://gnumbers.blogspot.com.au/2011/10/Logarithm-froge- numéro-it-is-pas.html

et les internes de la bibliothèque GMP: https://gmplib.org/manual/integer-internals.html

(éditer: vous utilisez essentiellement le "chiffre" le plus significatif de la représentation GMP depuis La base de la représentation est énorme b ^ n est beaucoup plus grande que b ^ {n-1} )

Voici ma mise en œuvre pour les rationnels. xxx

(beaucoup plus tard modifier) Revenir à cela 5 ans plus tard, je pense que c'est cool que le concept de base de journal (a) = n journal (b) + journal (A_n) apparaît même dans des implémentations de points flottants natifs, < un href = "https://github.com/bminor/glibc/blob/master/sysdeps/ia64/fpu/e_logf.s" rel = "nofollow noreferrer"> ici est le glibc pour ia64 Et je l'ai utilisé à nouveau après avoir rencontré cette question


0 commentaires

2
votes

ici c'est: https://github.com/linas/anant

fournit à GNU MP Logarithme réel et complexe, Sine, Cosine, Gamma, Arctan, SQRT, Polylogarithm Riemann et Hurwitz Zeta, Hypergeométrie Confluent, Topologues Sine, et plus encore.


0 commentaires

1
votes

La méthode ci-dessous utilise mpz_get_d_2exp et a été obtenu à partir de GMP R Package . Il peut être trouvé sous la fonction biginteger_log code> dans le fichier bigintegerr.cc code> (vous devez d'abord télécharger la source (c'est-à-dire le fichier tar)).

// Adapted for general use from the original biginteger_log
// xi = di * 2 ^ ex  ==> log(xi) = log(di) + ex * log(2)

double biginteger_log_modified(mpz_t x) {
    signed long int ex;
    const double di = mpz_get_d_2exp(&ex, x);
    return log(di) + log(2) * (double) ex;
}


0 commentaires