2010-05-08 63 views
2

我試圖使用mpfr_set_str值0.9999存儲到mpfr_t變量()函數MPFR將0.9999舍入爲1?

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

感謝您的幫助

回答

3

精度given in bits,不以十進制數字表示,正如你似乎假設的那樣。看來您可以用15位精度將正確的值重新打印到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; 
} 
+0

謝謝,它現在正在工作。 – Silmaersti 2010-05-08 06:03:14