2014-10-17 105 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),简单地使用以上(或更复杂的)对数方程。