2010-07-23 5 views
7

Il semble que GMP ne fournit que la sérialisation de chaîne de la MPF (à virgule flottante) type: TypeComment sérialiser le type GMP mpf?

mpf_get_str(), mpf_class::get_str()

Le mpz (entier) comporte une interface supplémentaire pour les octets premières: mpz_out_raw()

http://gmplib.org/manual/Function-Index.html

Ai-je raté quelque chose? Est-ce que quelqu'un sait d'une autre bibliothèque qui peut sérialiser des flottants de GMP? Est-ce que quelqu'un sait d'une autre bignum lib qui offre une sérialisation robuste?

Edit: Je serais heureux avec sérialisation de mpfr_t de MPFR, ainsi, ce qui semble de la même que pour offrir la sortie de chaîne: http://www.mpfr.org/mpfr-current/mpfr.html#Function-Index

Répondre

6

C'était depuis longtemps, mais je blesse faire quelque chose comme this:

int mpf_out_raw (FILE *f, mpf_t X) { 
    int expt; mpz_t Z; size_t nz; 
    expt = X->_mp_exp; 
    fwrite(&expt, sizeof(int), 1, f); 
    nz = X->_mp_size; 
    Z->_mp_alloc = nz; 
    Z->_mp_size = nz; 
    Z->_mp_d  = X->_mp_d; 
    return (mpz_out_raw(f, Z) + sizeof(int)); 
} 

void mpf_inp_raw (FILE *f, mpf_t X) { 
    int expt; mpz_t Z; size_t nz; 
    mpz_init (Z); 
    fread(&expt, sizeof(int), 1, f); 
    mpz_inp_raw (Z, f); 
    mpf_set_z (X, Z); 
    X->_mp_exp = expt; 
    mpz_clear (Z); 
} 
1

Vous pouvez faire entrée et la sortie des octets dans flotte GMP. Les listes manual page on I/O of Floats les fonctions suivantes:

size_t mpf_out_str (FILE *stream, int base, size_t n_digits, mpf_t op) 
size_t mpf_inp_str (mpf_t rop, FILE *stream, int base) 

La partie source de confusion au sujet du manuel est qu'il énumère les routines d'E/S pour les différents types dans les différentes sections.

Modifier: Je me trompais totalement! Ces fonctions effectuent la conversion de chaîne et non la sortie des octets bruts.