2

mpfr_set_str() 関数を使用して、値 0.9999 を mpfr_t 変数に格納しようとしています。

ただし、丸め値 (GMP_RNDD、GMP_RNDU、GMP_RNDN、GMP_RNDZ) に関係なく、0.9999 は保存中に 1 (または他の値 != 0.9999) に丸められます。

mpfr_set_str() を使用して mpfr_t 変数に 0.9999 を格納する最良の方法は何でしょうか? 出来ますか?

これが私のテストプログラムです。必要な「buffer is: 0.9999」ではなく、「buffer is: 1」と出力されます。

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

あなたが想定しているように、精度は10進数ではなくビットで与えられます。正しい値を 15 ビット精度で 10 進数 4 桁に転記できるようです。また、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 に答える