static void dec128_to_mpd_conv(mpd_context_t * ctx, mpd_t *result, const uint64_t significand_low, const int64_t significand_high, const int64_t exponent_part){ uint32_t status = 0; mpd_t *ten, *sig1, *sig2, *stemp, *sig, *s64, *exp_pow, *exp_partmpd; ten = mpd_qnew(); s64 = mpd_qnew(); sig1 = mpd_qnew(); sig2 = mpd_qnew(); stemp = mpd_qnew(); sig = mpd_qnew(); exp_pow = mpd_qnew(); exp_partmpd = mpd_qnew(); mpd_qset_i64(ten,10LL,ctx,&status); /* 2^64 */ mpd_qset_string(s64,"18446744073709551616",ctx,&status); mpd_qset_u64(sig1,significand_low,ctx,&status); mpd_qset_i64(sig2,significand_high,ctx,&status); mpd_qmul(stemp,sig2,s64,ctx,&status); mpd_qadd(sig,stemp,sig1,ctx,&status); mpd_qset_i64(exp_partmpd,exponent_part,ctx,&status); mpd_qpow(exp_pow,ten,exp_partmpd,ctx,&status); mpd_qmul(result,sig,exp_pow,ctx,&status); mpd_del(ten); mpd_del(sig1); mpd_del(sig2); mpd_del(sig); mpd_del(stemp); mpd_del(s64); mpd_del(exp_pow); mpd_del(exp_partmpd); }
void test_mpd(void) { mpd_context_t ctx; mpd_t *n; char *sn = NULL; uint32_t res = 0; mpd_maxcontext(&ctx); n = mpd_qnew(); if (!n) { die("Allocating new number failed\n"); } mpd_qset_string(n, NUMBER1, &ctx, &res); sn = mpd_to_sci(n, 0); if (strcmp(sn, NUMBER1) != 0) { die("Failed converting number to string\n"); } free(sn); mpd_del(n); }
int main(){ mpd_context_t ctx; mpd_t *result1; mpd_t *result2; mpd_t *result3; mpd_setminalloc(MPD_MINALLOC_MAX); mpd_ieee_context(&ctx, 160); result1 = mpd_qnew(); result2 = mpd_qnew(); result3 = mpd_qnew(); //mpd_qset_u64(result1,2ULL,&ctx,&status); dec32_to_mpd(&ctx,result1,dec32); dec64_to_mpd(&ctx,result2,dec64); dec128_to_mpd(&ctx,result3,dec128); //mpd_qset_u64(result2,4ULL,&ctx,&status); //mpd_qpow(result3,result1,result2,&ctx,&status); mpd_print(result1); mpd_print(result2); mpd_print(result3); /*print_mpd(result1); print_mpd(result2); print_mpd(result3);*/ _Decimal32 ddd = mpd_to_dec32(result1); printf ("Compare is %d\n", memcmp(&ddd,&dec32,sizeof(_Decimal32))); printf ("0x%x\n0x%x\n", *((uint32_t *)(void *)&ddd), *((uint32_t *)(void *)&dec32)); _Decimal64 ddd64 = mpd_to_dec64(result2); printf ("Compare is %d\n", memcmp(&ddd64,&dec64,sizeof(_Decimal64))); printf ("0x%I64x\n0x%I64x\n", *((uint64_t *)(void *)&ddd64), *((uint64_t *)(void *)&dec64)); _Decimal128 ddd128 = mpd_to_dec128(result3); printf ("Compare is %d\n", memcmp(&ddd128,&dec128,sizeof(_Decimal128))); printf ("0x%I64d\n0x%I64x\n", *((uint64_t *)(void *)&ddd128), *((uint64_t *)(void *)&dec128)); mpd_del(result1); mpd_del(result2); mpd_del(result3); print_dec32(&dec32); print_dec64(&dec64); print_dec128(&dec128); return 0; }
static void dec_to_mpd_conv(mpd_context_t * ctx, mpd_t *result, const int64_t significand_low, const int64_t exponent_part){ uint32_t status = 0; mpd_t *ten, *exp_pow, *exp_partmpd, *significand_partmpd; ten = mpd_qnew(); exp_pow = mpd_qnew(); exp_partmpd = mpd_qnew(); significand_partmpd = mpd_qnew(); mpd_qset_i64(ten,10LL,ctx,&status); mpd_qset_i64(significand_partmpd,significand_low,ctx,&status); mpd_qset_i64(exp_partmpd,exponent_part,ctx,&status); mpd_qpow(exp_pow,ten,exp_partmpd,ctx,&status); mpd_qmul(result,significand_partmpd,exp_pow,ctx,&status); mpd_del(ten); mpd_del(exp_pow); mpd_del(exp_partmpd); mpd_del(significand_partmpd); }