2010-01-24 4 views
3

J'utilise GMP, et je veux être en mesure de convertir rapidement un mpz en mpf. J'ai regardé à travers la bibliothèque et ne pouvais pas trouver beaucoup. La meilleure chose que je pouvais penser était le suivant:GMP convertir mpz en mpf

mpz_t x; 
/* Insert code here that assigns some value to x */ 
char buf[SIZE]; 
gmp_sprintf(buf, "%Zd", x); 
mpf_t y; 
mpf_set_str(y, buf); 

Cette solution nécessite une conversion répétée et d'une chaîne. En outre, il est limité par SIZE, et je ne vois aucun moyen de prédéterminer la taille SIZE doit être. Y a-t-il une meilleure façon de faire cette conversion?

Répondre

5

Qu'en est-il de l'utilisation mpf_set_z (mpf_t rop, mpz_t op)?

Aussi (je suppose que vous l'avez fait) vos variables mpz et mpf devront être initialisées avec mpf_init(mpf_t x) et mpz_init(mpz_t x).

Alors vous feriez:

mpz_t x; 
mpz_init(x); 
/* Insert code here that assigns some value to x */ 
mpf_t y; 
mpf_init(y); 
mpf_set_z(y,x); 
2

Wow, compte tenu de la mauvaise réputation de sprintf Je suis surpris ils ont même inclus une fonction semblable.

mpz_sizeinbase peut être utilisé pour calculer l'espace dont vous aurez besoin pour conserver une représentation en base 10 d'un nombre entier. Et l'autre personne qui a répondu est correcte, mpf_set_z est un bien meilleur moyen que de convertir l'entier en une chaîne de base 10 et de le relire dans un flottant.