Frage

Ich versuche, den Wert 0,9999 in eine mpfr_t Variable zu speichern mit der mpfr_set_str () Funktion

Aber 0,9999 auf 1 gerundet (oder einem anderen Wert! = 0,9999) während der Lagerung nicht den runden Wertes Rolle (GMP_RNDD, GMP_RNDU, GMP_RNDN, GMP_RNDZ)

Also, was ist die beste Methode zum Speichern von 0,9999 in einer mpfr_t Variable mpfr_set_str ()? Ist es möglich?

Hier ist mein Testprogramm, druckt es „Puffer: 1“, statt der wollte „Puffer: 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;
}

Danke für die Hilfe

War es hilfreich?

Lösung

Präzision ist in Bits gegeben , nicht in dezimal Zahlen, wie Sie zu der Annahme scheinen. Es scheint, dass Sie den richtigen Wert auf 4 Dezimalstellen mit 15 Bit Genauigkeit erneut drucken können. Außerdem können Sie die Ausgabe direkt mit mpfr_printf.

Wenn Sie Gebrauch mpfr_get_str brauchen, würde ich null als ersten Parameter übergeben. Wenn Sie das tun, dass die Zeichenfolge für Sie zugeordnet ist. Dann ist es zu befreien Sie mpfr_free_str nennen.

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top