Вопрос

Я пытаюсь сохранить значение 0,9999 в переменную MPFR_T с помощью функции MPFR_SET_STR ()

Но 0,9999 округляется до 1 (или какое-либо другое значение! = 0,9999) Во время хранения, независимо от круглого значения (GMP_RNDD, GMP_RNDU, GMP_RNDN, GMP_RNDZ)

Так какой метод лучше всего хранить 0,9999 в переменной MPFR_T с помощью MPFR_SET_STR ()? Является ли это возможным?

Вот моя тестовая программа, она печатает «буфер: 1», а не требуемый «буфер: 0,999»:

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;
}

Спасибо за помощь

Это было полезно?

Решение

Точность есть дано в битах, не в десятичных цифрах, как вы, кажется, предполагаете. Похоже, вы можете перепечатать правильное значение до 4 десятичных цифр с частотой 15 битов. Кроме того, вы можете выводить напрямую с помощью MPFR_Printf.

Если вам нужно использовать MPFR_GET_STR, я бы прошел NULL в качестве первого параметра. Если вы сделаете это, строка выделена для вас. Затем, чтобы освободить его, вы звоните 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top