2015-02-24 76 views
2

我有一個程序,它將字符串中的數字讀入到mpz_t中,然後將其轉換爲mpf_t。儘管從文件中正確讀取,但我將它們轉換爲mpf_t時會出現精度損失。代碼如下:使用GMP精確丟失

#include <gmp.h> 
#include <stdlib.h> 
#include <stdio.h> 

int main (int argc, char **argv) { 
    char* str = "632512364206354367378453"; 
    mpz_t x; 

    mpz_init_set_str(x, str, 10); 

    mpf_t a; 
    mpf_init(a); 
    mpf_set_z(a, x); 
    gmp_printf("mpz_t: %Zd\n", x); 
    gmp_printf("mpf_t: %Ff\n", a); 
} 

這個例子的輸出是:

mpz_t: 632512364206354367378453 
mpf_t: 632512364206354367378000.000000 

正如你所看到的最後3個位數是不正確的。我怎樣才能避免這種情況?是否有任何其他功能來執行此轉換?

由於

回答

6

manual page

Function:無效mpf_init(mpf_t X)

初始化X爲0。通常情況下,變量應僅一次或至少初始化被清除,在初始化之間使用mpf_clear。 x的精度未定義,除非通過調用mpf_set_default_prec已建立默認精度 。

這是你的問題。

解決方案:

Function:無效mpf_init2(mpf_t X,mp_bitcnt_t PREC)

初始化X爲0,並設置其精度爲至少PREC比特。通常情況下,一個變量只能初始化一次,或者至少在初始化之間用mpf_clear清除掉 。

這樣,您可以使用prec precision count參數來指定您想要的精度位數。

+0

是否有任何函數可以從mpz_t中獲取精度,然後我可以使用它來初始化mpf_t? – fc67 2015-02-24 21:26:41

+4

@ fc67'mpz_sizeinbase'可以提供幫助。 – 2015-02-24 22:08:42