2010-07-18 24 views
1

J'ai un problème dans lequel j'ai besoin d'être prêt à explorer une plus grande plage de nombres qu'un long non-dimensionné peut représenter (la plage étant représentée par 3^(n * n)). Cette communauté m'a conseillé d'utiliser GMP pour les nombres à plusieurs précisions. Puisque j'ai besoin de parcourir la plage un nombre à la fois, j'ai besoin d'un moyen d'incrémenter mon compteur facilement. Mon impulse est d'utiliser "mpz_add_ui (mon_counter, mon_counter, 1UL);", mais je crains que le fait de passer mon compteur à la fois comme argument de retour et comme ajout peut entraîner la corruption du résultat. Si la fonction change l'opérateur de retour pendant qu'il calcule la réponse, il peut changer le numéro de manière à ce que la réponse soit fausse. Il est peu probable que l'incrémentation cause des problèmes, mais qu'en est-il de l'ajout de deux grands mpz_t? Ou multiplier, ou même exponentiation? La documentation n'a rien pour calmer ou confirmer mes inquiétudes. J'ai essayé de regarder le code source, mais la combinaison de macros, de commentaires épars et de saut d'un fichier à un autre m'a amené à conclure que je ne suis pas assez bon pour le suivre.Dans GMP, le passage d'un type de précision multiple à la fois comme argument de retour et comme argument d'opérande fonctionne-t-il?

Pour être sûr, j'ai écrit une fonction qui montre le format que je suis assez certain qu'on va travailler, mais je voudrais bien mieux l'éviter parce que je suis certain qu'il va ralentir mon programme vers le bas:

void mpz_increment(mpz_t) { 
    mpz_t temp; 
    mpz_init(temp); 
    mpz_add_ui(temp, a, 1UL); 
    mpz_set(a, temp); 
    mpz_clear(temp); 
} 

Alors , ma question est la suivante. Est-il prudent de passer un type de précision multiple à une fonction arithmétique GMP comme argument de retour et l'un des opérandes, ou cela entraînera-t-il des résultats corrompus?

Répondre

2

Oui, vous pouvez transmettre la même instance en tant que paramètre d'entrée et de sortie. Cela est indiqué explicitement dans la section « Variable Conventions » de la documentation:

GMP vous permet d'utiliser la même variable pour entrée et de sortie en un seul appel. Pour exemple, la fonction principale de la multiplication entier , mpz_mul, peut être utilisé à la case x et mettre le résultat en arrière x avec

mpz_mul (x, x, x); 
+0

Ha ha, il fait. Merci d'avoir fait remarquer cela! – sadakatsu