سؤال

أحاول تخزين القيمة 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.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 أرقام عشرية بدقة 15 بت. أيضًا ، يمكنك الإخراج مباشرة باستخدام MPFR_PRINTF.

إذا كنت بحاجة إلى استخدام MPFR_GET_STR ، فسوف أُمرر كمعلمة أول. إذا قمت بذلك ، يتم تخصيص السلسلة لك. ثم ، لتحريرها ، يمكنك الاتصال بـ 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