2010-05-08 6 views

Répondre

5

Oui, il y a une fonction mpz_set_d que vous pouvez utiliser à cet effet:

void mpz_set_d (mpz_t rop, double op); 

Le flotteur sera mis à niveau vers un double par C lui-même et GMP transformer en un type mpz_t pour vous. Mais vous devez savoir que mpz_t est un type entier, vous risquez donc de perdre de la précision. Si vous utilisez simplement les flottants pour contenir des nombres entiers supérieurs à votre type long, cela devrait aller.

Si vous souhaitez gérer réelles valeurs en virgule flottante, vous devez probablement utiliser mpf_t.


Pour se développer, voici quelques exemples de code et de sortie:

#include <stdio.h> 
#include <values.h> 
#include <gmp.h> 

int main (void) { 
    float f = MAXFLOAT; 

    mpz_t num; 
    mpz_init_set_d (num, f); 

    printf ("Max float: %f\n", f); 
    printf ("As mpz_t : "); 
    mpz_out_str (stdout, 10, num); 
    putchar ('\n'); 

    return 0; 
} 

Notez l'utilisation du combiné mpz_init_set_d (num, f) pour simplifier le code. Cela équivaut aux deux déclarations:

mpz_init (num); 
mpz_set_d (num, f); 

Le programme ci-dessus sorties:

Max float: 340282346638528859811704183484516925440.000000 
As mpz_t : 340282346638528859811704183484516925440 
+0

Merci, oui je ne voulais tronquer décimaux. Cependant maintenant je réalise que je devrais employer des doubles au lieu des flotteurs. –

+0

inversement, auriez-vous à savoir comment convertir un mpq_t à la meilleure approximation flottante? je peux écrire quelque chose pour cela mais je me demandais s'il y a déjà quelque chose intégré ... ne pouvait pas le trouver –

+0

il y a en fait une fonction mpq_get_d qui renvoie un double qui se rapproche du mpq_t –