2010-05-08 4 views
2

je tente de stocker la valeur 0,9999 dans une variable mpfr_t en utilisant la fonction mpfr_set_str()MPFR Arrondi 0,9999 à 1?

Mais 0,9999 est arrondi à 1 (ou une autre valeur! = 0,9999) pendant le stockage, peu importe la valeur ronde (GMP_RNDD , GMP_RNDU, GMP_RNDN, GMP_RNDZ)

Alors quelle est la meilleure méthode pour stocker 0.9999 dans une variable mpfr_t en utilisant mpfr_set_str()? Est-ce possible?

Voici mon programme de test, il imprime "tampon est: 1", au lieu de la voulait "tampon est: 0,9999":

int main() 
{ 

    size_t precision = 4; 
    mpfr_t mpfrValue; 

    mpfr_init2(mpfrValue, precision); 
    mpfr_set_str(mpfrValue, "0.9999", 10, GMP_RNDN); 

    char *buffer = (char*)malloc((sizeof(char) * precision) + 3); 
    mp_exp_t exponent; 

    mpfr_get_str(buffer, 
       &exponent, 
       10, 
       precision, 
       mpfrValue, 
       GMP_RNDN); 

    printf("buffer is: %s\n", buffer); 

    free(buffer); 
    mpfr_clear(mpfrValue); 

    return 0; 
} 

Merci pour l'aide

Répondre

3

précision est given in bits, non en chiffres décimaux, comme vous semblez l'assumer. Il semble que vous pouvez réimprimer la valeur correcte à 4 chiffres décimaux avec une précision de 15 bits. En outre, vous pouvez générer directement à l'aide de mpfr_printf.

Si vous avez besoin d'utiliser mpfr_get_str, je passerais null comme premier paramètre. Si vous faites cela, la chaîne est allouée pour vous. Ensuite, pour le libérer, vous appelez mpfr_free_str.

int main() 
{ 
    size_t precision = 15; 
    mpfr_t mpfrValue; 

    mpfr_init2(mpfrValue, precision); 
    mpfr_set_str(mpfrValue, "0.9999", 10, GMP_RNDN); 

    mpfr_printf("Value is: %Rf\n", mpfrValue); 
    mpfr_clear(mpfrValue); 
    return 0; 
} 
+0

Merci, ça marche maintenant. – Silmaersti