从float到mpz_t

Wil*_*ken 4 c gmp

我在C中使用GMP.是否可以将mpz_t设置为浮点值?

pax*_*blo 5

是的,有一个功能mpz_set_d可以用于此目的:

void mpz_set_d (mpz_t rop, double op);
Run Code Online (Sandbox Code Playgroud)

浮动将由C本身升级为double,然后GMP会将其转换为mpz_t适合您的类型.

但是你应该知道这mpz_t是一个整数类型,所以你可能会失去精度.如果你只是使用浮点数来保持大于你的long类型的整数,那应该没问题.

如果要处理实际浮点值,则应该使用mpf_t.


要扩展,这里有一些示例代码和输出:

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

int main (void) {
    float f = MAXFLOAT;

    mpz_t num;
    mpz_init_set_d (num, f);

    printf ("Max float: %f\n", f);
    printf ("As mpz_t : ");
    mpz_out_str (stdout, 10, num);
    putchar ('\n');

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意使用组合mpz_init_set_d (num, f)来简化代码.这相当于两个陈述:

mpz_init (num);
mpz_set_d (num, f);
Run Code Online (Sandbox Code Playgroud)

上述程序输出:

Max float: 340282346638528859811704183484516925440.000000
As mpz_t : 340282346638528859811704183484516925440
Run Code Online (Sandbox Code Playgroud)