Domanda

Sto cercando di memorizzare il valore 0.9999 in una variabile mpfr_t utilizzando la funzione mpfr_set_str ()

Ma 0.9999 è arrotondato a 1 (o qualche altro valore! = 0,9999) durante lo stoccaggio, non importa il valore di arrotondamento (GMP_RNDD, GMP_RNDU, GMP_RNDN, GMP_RNDZ)

Allora, qual è il metodo migliore per conservare 0.9999 in una variabile mpfr_t utilizzando mpfr_set_str ()? E 'possibile?

Ecco il mio programma di test, viene stampato "buffer è: 1", al posto di The Wanted "buffer è: 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;
}

Grazie per l'aiuto

È stato utile?

Soluzione

proposta in bit , non in decimale cifre, come ti sembra di essere ammesso. Sembra che è possibile ristampare il valore corretto a 4 cifre decimali con 15 bit di precisione. Inoltre, è possibile uscita direttamente utilizzando mpfr_printf.

Se si ha bisogno di utilizzare mpfr_get_str, vorrei passare null come primo parametro. Se lo fai la stringa viene allocata per voi. Poi, per liberarlo si chiama 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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top