2

我正在尝试使用 mpfr_set_str() 函数将值 0.9999 存储到 mpfr_t 变量中

但 0.9999 在存储期间被舍入为 1(或其他值!= 0.9999),无论舍入值如何(GMP_RNDD、GMP_RNDU、GMP_RNDN、GMP_RNDZ)

那么使用 mpfr_set_str() 将 0.9999 存储在 mpfr_t 变量中的最佳方法是什么?是否可以?

这是我的测试程序,它打印“缓冲区为:1”,而不是想要的“缓冲区为: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;
}

谢谢您的帮助

4

1 回答 1

3

正如您似乎假设的那样,精度以 bits 给出,而不是十进制数字。看来您可以将正确的值重新打印为 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;
}
于 2010-05-08T05:59:15.323 回答