2014-10-17 95 views
2

我想打印是否可以使用gmp打印浮點數的大量數字?

numbers of decimal expansion of ratio

33877456965431938318210482471113262183356704085033125021829876006886584214655562/237142198758023568227473377297792835283496928595231875152809132048206089502588927

我嘗試用GMP庫做到這一點:

// gcc p.c -lgmp 

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

int main (int argc, char **argv) 
{  



    mpf_set_default_prec(1024); // set default precision in bits 


    // declare 
    mpz_t zn; 
    mpz_t zd; 
    mpq_t q; 
    mpf_t fn; 
    mpf_t fd; 
    mpf_t f; // f=float(q=n/d) 

    // init 
    mpz_init (zn); 
    mpz_init (zd); 
    mpq_init (q); 
    mpf_init2 (fn, 794564201485273000257607338237654476912493997529945960250807965815440); 
    mpf_init (fd); 
    mpf_init (f); 

    // set 
    mpz_set_str(zn, "33877456965431938318210482471113262183356704085033125021829876006886584214655562", 10); // 
    // mpz_set_ui(n,33877456965431938318210482471113262183356704085033125021829876006886584214655562); warning: integer constant is too large for its type [enabled by default] 
    mpz_set_str(zd, "237142198758023568227473377297792835283496928595231875152809132048206089502588927", 10); 
    mpq_set_str(q, "33877456965431938318210482471113262183356704085033125021829876006886584214655562/237142198758023568227473377297792835283496928595231875152809132048206089502588927", 10); 

    mpf_set_z(fn, zn); 
    mpf_set_z(fd, zd); 



    // 
    mpf_div(f, fn, fd); 

    // print result 
    gmp_printf (" decimal floating point number : %.Ff \n", f); // 

    // clear 
    mpz_clear (zn); 
    mpz_clear (zd); 
    mpq_clear(q); 
    mpf_clear (fn); 
    mpf_clear (fd); 
    mpf_clear (f); 

    return 0; 

}

但結果是隻有22個十進制數字:

十進制浮點數字:0.142857142857142857143

我應該怎麼辦呢?

+1

你的意思是「結果不好?」您的問題陳述需要更具體。 – 2014-10-17 16:12:42

+0

結果現在列出。 Thx指向它。 – Adam 2014-10-17 16:16:08

回答

0
// gcc p.c -lgmp 

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

int main (int argc, char **argv) 
{  



    mpf_set_default_prec(100024); // set default precision in bits 


    // declare 
    mpz_t zn; 
    mpz_t zd; 
    mpq_t q; 
    mpf_t fn; 
    mpf_t fd; 
    mpf_t f; // f=float(q=n/d) 

    // init 
    mpz_init (zn); 
    mpz_init (zd); 
    mpq_init (q); 
    mpf_init (fn) ; //794564201485273000257607338237654476912493997529945960250807965815440 ,100); 
    mpf_init (fd); 
    mpf_init (f); 

    // set 
    mpz_set_str(zn, "33877456965431938318210482471113262183356704085033125021829876006886584214655562", 10); // 
    // mpz_set_ui(n,33877456965431938318210482471113262183356704085033125021829876006886584214655562); warning: integer constant is too large for its type [enabled by default] 
    mpz_set_str(zd, "237142198758023568227473377297792835283496928595231875152809132048206089502588927", 10); 
    //mpq_set_str(q, "33877456965431938318210482471113262183356704085033125021829876006886584214655562/237142198758023568227473377297792835283496928595231875152809132048206089502588927", 10); 

    mpf_set_z(fn, zn); 
    mpf_set_z(fd, zd); 



    // 
    mpf_div(f, fn, fd); 

    // print result 
    printf (" ratio = "); mpz_out_str(stdout, 10,zn); printf ("/");  mpz_out_str(stdout, 10,zd); printf (" \n "); 
    gmp_printf (" decimal floating point number : %.Ff \n", f); // 

    // clear 
    mpz_clear (zn); 
    mpz_clear (zd); 
    mpq_clear(q); 
    mpf_clear (fn); 
    mpf_clear (fd); 
    mpf_clear (f); 

    return 0; 

}

上面的代碼是好,但如果我要n個十進制數字,我應該設置精度N * 4?

編輯:

我想打印1589128402970546000515214676475308953824987995059891920501615931630880數...

這是根本不可能的,因爲它是10^71號這是all books in the world更多的則字符(字母)( 10^8本書X 10^5 chars per book

+0

這是什麼? ... – 2014-10-17 18:26:05

2

您需要提高精度(即尾數位),以獲得更多的十進制數字。如GMP documentation狀態(重點煤礦):

每個浮點的尾數具有用戶可選擇的精度,有限 只受可用存儲器。每個變量都有其自己的精度,並且可以在任何時候增加或減少。

默認情況下,選擇64位的尾數,而且基本上你得到的是有關:

dig10 = floor(dig2/log2(10))

因此你也只有約19顯著,一開始十進制數字。通過要求更精確,你只是得到更多的人:

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

int main(void) 
{ 
    mpz_t zn, zd; 
    mpf_t fn, fd, f; 

    mpf_set_default_prec(1024); 

    mpz_init_set_str(zn, "33877456965431938318210482471113262183356704085033125021829876006886584214655562", 10); 
    mpz_init_set_str(zd, "237142198758023568227473377297792835283496928595231875152809132048206089502588927", 10); 

    mpf_init(fn); mpf_init(fd); mpf_init(f); 

    mpf_set_z(fn, zn); 
    mpf_set_z(fd, zd); 

    mpf_div(f, fn, fd); 

    gmp_printf ("decimal floating point number: %.Ff\n", f); 

    return 0; 
} 

結果爲:

decimal floating point number: 0.1428571428571428571428571428571428571428571428571428571428571428571428571428571470740220344350664325965724776508647459411274100902601628882480671861148592450467118250772869175909603098316903937670228712738977340379914830920623570643668473851880233962854802649343258544237378422095661611829666642751471587447213 

如果你想要的小數位數一些固定的金額(並假設zn/zd商爲0),簡單地使用以上(或更復雜的)對數方程。