Floating point 是否可以使用gmp打印大量浮点数?

Floating point 是否可以使用gmp打印大量浮点数?,floating-point,precision,gmp,Floating Point,Precision,Gmp,我想打印 158912840297054605152146747530895382498799505989191920501615931630880 : 3387745696543193831821048247111326218356704080503125012829876600688658421465562/237142198758023568227473772977928352838496928595223187515280913204820608950258827 我尝试使用gmp库执行

我想打印

158912840297054605152146747530895382498799505989191920501615931630880

:

3387745696543193831821048247111326218356704080503125012829876600688658421465562/237142198758023568227473772977928352838496928595223187515280913204820608950258827

我尝试使用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;
//gcc p.c-lgmp
#包括
#包括
int main(int argc,字符**argv)
{       
mpf_set_default_prec(1024);//以位为单位设置默认精度
//申报
mpz_t zn;
mpz_t zd;
mpq_t q;
强积金计划;
强积金计划;
mpf\u t f;//f=float(q=n/d)
//初始化
mpz_init(zn);
mpz_init(zd);
mpq_init(q);
强积金倡议2(fn,7945642014852730002576073382376544769124939975299459250807965815440);
强积金初始计划(fd);
强积金初始(f);
//设置
mpz_set_str(zn,“33877456965431938318210482471113262183567040503125012502182987600688658421465562”,10);//
//mpz_set_ui(n,33877456965431938318210482471113262183567040503125012502182987600688658421465562);警告:整数常量对于其类型而言太大[默认启用]
mpz_set_str(zd,“237142198758023568227473772972835283449692859522318751528009132048206089502588927”,10);
mpq_set_str(q,“338774569654319383182104824711132618335670408050312501282987600688658421465562/23714219875802356822747377297792835283839692859522318751528009132048206089502588928927”,10);
强积金(fn,zn),;
强积金(fd,zd);;
//
强积金课(f、fn、fd);
//打印结果
gmp_printf(“十进制浮点数:%.Ff\n”,f)//
//清楚的
mpz_透明(zn);
mpz_清除(zd);
mpq_清除(q);
强积金计划(fn);
强积金计划;
强积金(积金);;
返回0;
}

但结果只有22位小数:

十进制浮点数:0.142857142857142857143

我应该怎么做?

//gcc p.c-lgmp
// 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;
#包括 #包括 int main(int argc,字符**argv) { mpf_set_default_prec(100024);//以位为单位设置默认精度 //申报 mpz_t zn; mpz_t zd; mpq_t q; 强积金计划; 强积金计划; mpf\u t f;//f=float(q=n/d) //初始化 mpz_init(zn); mpz_init(zd); mpq_init(q); 强积金初始(fn);/7945642014852730002576073382376544769124939975299459250807965815440100); 强积金初始计划(fd); 强积金初始(f); //设置 mpz_set_str(zn,“33877456965431938318210482471113262183567040503125012502182987600688658421465562”,10);// //mpz_set_ui(n,33877456965431938318210482471113262183567040503125012502182987600688658421465562);警告:整数常量对于其类型而言太大[默认启用] mpz_set_str(zd,“237142198758023568227473772972835283449692859522318751528009132048206089502588927”,10); //mpq_set_str(q,“338774569654319383182104824711132618335670408050312501282987600688658421465562/23714219875802356822747377297792835283839692859522318751528009132048206089502588928927”,10); 强积金(fn,zn),; 强积金(fd,zd);; // 强积金课(f、fn、fd); //打印结果 printf(“ratio=”);mpz_out_str(stdout,10,zn);printf(“/”);mpz_out_str(stdout,10,zd);printf(“\n”); gmp_printf(“十进制浮点数:%.Ff\n”,f)// //清楚的 mpz_透明(zn); mpz_清除(zd); mpq_清除(q); 强积金计划(fn); 强积金计划; 强积金(积金);; 返回0;
}

上面的代码更好,但如果我需要n个十进制数字,我应该将精度设置为n*4吗

编辑:

我想打印158912840297054605152146764753089538249879950598991920501615931630880号码


这是根本不可能的,因为它是10^71个数字,比(10^8册x)中的字符(字母)还要多。

您需要提高精度(即尾数位)以获得更多的十进制数字。各国(强调我国):

每个浮点的尾数都有一个用户可选择的精度,有限 只有可用的内存。每个变量都有自己的精度,并且 可以随时增加或减少

默认情况下,它选择64位作为尾数,基本上您得到的是:

dig10=地板(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;
}

如果您想要一些固定数量的十进制数字(并且假设
zn/zd
商为零),只需使用上述(或更复杂的)对数方程。

您所说的“结果不好”是什么意思?您的问题陈述需要更具体。现在列出结果。谢谢你的指点。
decimal floating point number: 0.1428571428571428571428571428571428571428571428571428571428571428571428571428571470740220344350664325965724776508647459411274100902601628882480671861148592450467118250772869175909603098316903937670228712738977340379914830920623570643668473851880233962854802649343258544237378422095661611829666642751471587447213