#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "mpi.h"

#define USE_GMP
#define USE_MPFR
#include "mpi_bnc.h"

int main(int argc, char *argv[])
{
	int num_procs, myrank;
	mpf_t a, b;
	void *buf;
	int tag = 0;
	MPI_Status status;

	MPI_Init(&argc, &argv);

	_mpi_set_bnc_default_prec_decimal(50, MPI_COMM_WORLD);
	commit_mpf(&(MPI_MPF), ceil(50/log10(2.0)), MPI_COMM_WORLD);

	MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
	MPI_Comm_rank(MPI_COMM_WORLD, &myrank);

	mpf_init_set_ui(a, 0);
	mpf_init_set_ui(b, 0);
	if(myrank == 0)
		mpf_set_ui(a, 1);

	buf = allocbuf_mpf(mpf_get_prec(a), 1);
	pack_mpf(a, 1, buf);
	MPI_Bcast(buf, 1, MPI_MPF, tag, MPI_COMM_WORLD);
	unpack_mpf(buf, a, 1);

	printf("Process %d: a = ", myrank);
	mpf_out_str(stdout, 10, 0, a);
	printf(", b = ");
	mpf_out_str(stdout, 10, 0, b);
	printf("\n");

	free(buf);
	mpf_clear(a);
	mpf_clear(b);
	free_mpf(&(MPI_MPF));

	MPI_Finalize();

	return EXIT_SUCCESS;
}

