decimal128 * decimal128FromNumber (decimal128 *d128, const decNumber *dn, decContext *set) { /* decimal128 and _Decimal128 are different types. */ union { _Decimal128 _Dec; decimal128 dec; } u; __dpd128FromNumber (d128, dn, set); /* __dpd128FromNumber returns in big endian. But _dpd_to_bid128 takes host endian. */ __ieee_to_host_128 (*d128, &u._Dec); /* Convert DPD to BID. */ _dpd_to_bid128 (&u._Dec, &u._Dec); /* dfp.c is in bid endian. */ __host_to_ieee_128 (u._Dec, &u.dec); /* d128 is returned as a pointer to _Decimal128 here. */ *d128 = u.dec; return d128; }
int isinfd128 (_Decimal128 arg) { decNumber dn; decimal128 d128; __host_to_ieee_128 (arg, &d128); decimal128ToNumber (&d128, &dn); return (decNumberIsInfinite (&dn)); }
decNumber * decimal128ToNumber (const decimal128 *bid128, decNumber *dn) { /* decimal128 and _Decimal128 are different types. */ union { _Decimal128 _Dec; decimal128 dec; } u; /* bid128 is a pointer to _Decimal128 in bid endian. But _bid_to_dpd128 takes host endian. */ __ieee_to_host_128 (*bid128, &u._Dec); /* Convert BID to DPD. */ _bid_to_dpd128 (&u._Dec, &u._Dec); /* __dpd128ToNumber is in bid endian. */ __host_to_ieee_128 (u._Dec, &u.dec); return __dpd128ToNumber (&u.dec, dn); }