将大整数打印为指数函数

时间:2015-07-02 15:46:49

标签: c printf gmp

我想以指数形式打印一个巨大的整数。像

这样的东西
Value 123456789012 as exp is 1.2345*10^12.

是否有任何gmp_printf格式来处理这个或者我应该先用一些mpz_get_exp函数来计算它?

mpz_t integer;
mpz_t exponent;
mpf_t top;

mpz_inits(integer, exponent, null);
mpf_init(top);

mpz_set_str(integer, "123456789012", 10);

???

gmp_printf("Value %Zd as exp is %.4Ff*10^%Zd",
           integer, top, exonent);

2 个答案:

答案 0 :(得分:1)

gmplib文档似乎表明%e%E printf选项应该可以正常工作。这些以科学记数法打印。

gmp_printf("%e", integer);

答案 1 :(得分:1)

%Fe%FE格式说明符需要mpf_t类型的对象。因此,您需要为gmp_printf()创建临时变量。例如:

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

int main(void)
{
    mpz_t integer;

    mpz_init_set_str(integer, "123456789012", 10);
    /* Print integer's value in scientific notation */
    {
        mpf_t tmp_float;
        mpf_init(tmp_float);
        mpf_set_z(tmp_float, integer);
        gmp_printf("%.4FE\n", tmp_float);
        mpf_clear(tmp_float);
    }
    mpz_clear(integer);
    return 0;
}

导致:

1.2346E+11

您可以mpz_get_d将其导出到POD double并按普通printf()打印:

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

int main(void)
{
    mpz_t integer;

    mpz_init_set_str(integer, "123456789012", 10);
    printf("%.4E\n", mpz_get_d(integer));

    mpz_clear(integer);
    return 0;
}

我希望第二种方法看起来更干净。