@Lin--
2019-09-11T01:57:17.000000Z
字数 2096
阅读 386
ComSec
练习使用C++和GMP进行大整数和高精度浮点数运算。
/*
* File : GmpWork_1.cpp
* Author : Hongpei Lin
* Date : 20190910
*
* Purpose : using "GMP" to compute Large Int and High precision Float
*/
#include <iostream>
#include "gmpxx.h"
using namespace std;
int main( )
{
//Large Int
mpz_t a, b, add, sub, mul, cdiv_q, cdiv_r, fdiv_q, fdiv_r, pow;//define Large Int
//initialize variable,decimal
mpz_init_set_str(a,"1234568799876543210123456789",10);
mpz_init_set_str(b,"98765432101245789",10);
mpz_inits(add, sub, mul, cdiv_q, cdiv_r, fdiv_q, fdiv_r, pow, NULL);
gmp_printf("a=%Zd,b=%Zd\n", a, b);
//compute
mpz_add(add, a, b);//add function
gmp_printf("Large Int add result %Zd\n", add);
mpz_sub(sub, a, b);//sub function
gmp_printf("Large Int sub result %Zd\n", sub);
mpz_mul(mul, a, b);//mul function
gmp_printf("Large Int mul result %Zd\n", mul);
mpz_cdiv_q(cdiv_q, a, b);//div function,ceil
gmp_printf("Large Int div(ceil) result %Zd\n", cdiv_q);
mpz_cdiv_r(cdiv_r, a, b);//mod function,ceil
gmp_printf("Large Int div(ceil) remainder %Zd\n", cdiv_r);
mpz_fdiv_q(fdiv_q, a, b);//div function,floor
gmp_printf("Large Int div(floor) result %Zd\n", fdiv_q);
mpz_fdiv_q(fdiv_r, a, b);//mod function,floor
gmp_printf("Large Int div(floor) remainder %Zd\n", fdiv_r);
mpz_pow_ui(pow, a, 3);//power function
gmp_printf("Large Int pow result %Zd\n", pow);
//free the variable
mpz_clears(pow, fdiv_r, fdiv_q, cdiv_r, cdiv_q, mul, sub, add, a, b, NULL);
gmp_printf("\n");
//High precision Float
mpf_t d, e, f_add, f_sub, f_mul, f_div, f_sqrt;
int n = 30;
//initialize variable
mpf_init_set_d(d, 3.141592653589793238462643383279);
mpf_init_set_d(e, 0.12356454134546482134564445);
mpf_inits(f_add, f_sub, f_mul, f_div, f_sqrt, NULL);
gmp_printf("d=%.*Ff,e=%.*Ff\n", n, d, n, e);
//compute
mpf_add(f_add, d, e);//add function
gmp_printf("High precision Float Add result %.*Ff\n", n, f_add);
mpf_sub(f_sub, d, e);//sub function
gmp_printf("High precision Float Sub result %.*Ff\n", n, f_sub);
mpf_mul(f_mul, d, e);//mul function
gmp_printf("High precision Float Mul result %.*Ff\n", n, f_mul);
mpf_div(f_div, d, e);//div function
gmp_printf("High precision Float Div result %.*Ff\n", n, f_div);
mpf_sqrt(f_sqrt, d);//div function
gmp_printf("High precision Float Sqrt result %.*Ff\n", n, f_sqrt);
mpf_clears(f_sqrt, f_div, f_mul, f_sub, f_add, e, d, NULL);
system("pause");
return 0;
}