Example #1
0
static _Decimal128 mpd_to_dec128(mpd_t *in){
  uint64_t exp_part,significand[2];
  uint16_t *bases_data;
  ud128 ret;
  mpd_context_t ctx;
  size_t bases;
  uint32_t status = 0;

  mpd_ieee_context(&ctx,MPD_DECIMAL128);
  mpd_qfinalize(in, &ctx,&status);
  exp_part = in->exp + (uint64_t)mpd_trail_zeros(in) + 6176LL; /* rough guess? */
  in->exp = 0;
  bases = mpd_sizeinbase(in, UINT16_MAX+1);
  bases_data = __mingw_dfp_get_globals()->mpd_callocfunc(bases < 8 ? 8 : bases,sizeof(uint16_t));
  mpd_qexport_u16(bases_data,bases,UINT16_MAX+1,in,&status);
  significand[0] = bases_data[0] | (uint64_t)bases_data[1] << 16 | (uint64_t)bases_data[2] << 32 | (uint64_t)bases_data[3] << 48;
  significand[1] = bases_data[4] | (uint64_t)bases_data[5] << 16 | (uint64_t)bases_data[6] << 32 | (uint64_t)bases_data[7] << 48;
  __mingw_dfp_get_globals()->mpd_free(bases_data);
  ret.t0.sign = mpd_isnegative(in);
  if((significand[1] & (0x7ULL << 57)) == (0x1ULL << 49)) { /* 100 MSB? */
    ret.t2.bits = 0x3;
    ret.t2.mantissaL = significand[0];
    ret.t2.mantissaH = significand[1];
    ret.t2.exponent = exp_part;
  } else {
    ret.t1.mantissaL = significand[0];
    ret.t1.mantissaH = significand[1];
    ret.t1.exponent = exp_part;
  }
  return ret.d;

}
Example #2
0
static _Decimal64 mpd_to_dec64(mpd_t *in){
  uint64_t exp_part, significand;
  uint32_t status = 0;
  size_t bases;
  uint16_t *bases_data;
  ud64 ret;
  mpd_context_t ctx;

  mpd_ieee_context(&ctx,MPD_DECIMAL64);
  mpd_qfinalize(in, &ctx,&status);

  exp_part = in->exp + (uint64_t)mpd_trail_zeros(in) + 398LL; /* rough guess? */
  in->exp = 0;
  bases = mpd_sizeinbase(in, UINT16_MAX+1);
  bases_data = __mingw_dfp_get_globals()->mpd_callocfunc(bases < 4 ? 4 : bases,sizeof(uint16_t));
  mpd_qexport_u16(bases_data,bases,UINT16_MAX+1,in,&status);
  significand = bases_data[0] | (uint64_t)bases_data[1] << 16 | (uint64_t)bases_data[2] << 32 | (uint64_t)bases_data[3] << 48;
  __mingw_dfp_get_globals()->mpd_free(bases_data);
  ret.t0.sign = mpd_isnegative(in);
  if((significand & (0x7ULL << 51)) == (0x1ULL << 53)) { /* 100 MSB? */
    ret.t2.bits = 0x3;
    ret.t2.mantissa = significand;
    ret.t2.exponent = exp_part;
  } else {
    ret.t1.mantissa = significand;
    ret.t1.exponent = exp_part;
  }
  return ret.d;
}
Example #3
0
size_t
mpd_export_u16(uint16_t *rdata, size_t rlen, uint32_t base, const mpd_t *src,
               mpd_context_t *ctx)
{
	size_t n;
	uint32_t status = 0;
	n = mpd_qexport_u16(rdata, rlen, base, src, &status);
	mpd_addstatus_raise(ctx, status);
	return n;
}