The software decimal floating point library implements IEEE 754-2008 decimal floating point arithmetic and is only activated on selected targets.
The software decimal floating point library supports either DPD (Densely Packed Decimal) or BID (Binary Integer Decimal) encoding as selected at configure time.
_Decimal32
__dpd_addsd3 (_Decimal32 a, _Decimal32 b)
¶_Decimal32
__bid_addsd3 (_Decimal32 a, _Decimal32 b)
¶_Decimal64
__dpd_adddd3 (_Decimal64 a, _Decimal64 b)
¶_Decimal64
__bid_adddd3 (_Decimal64 a, _Decimal64 b)
¶_Decimal128
__dpd_addtd3 (_Decimal128 a, _Decimal128 b)
¶_Decimal128
__bid_addtd3 (_Decimal128 a, _Decimal128 b)
¶These functions return the sum of a and b.
_Decimal32
__dpd_subsd3 (_Decimal32 a, _Decimal32 b)
¶_Decimal32
__bid_subsd3 (_Decimal32 a, _Decimal32 b)
¶_Decimal64
__dpd_subdd3 (_Decimal64 a, _Decimal64 b)
¶_Decimal64
__bid_subdd3 (_Decimal64 a, _Decimal64 b)
¶_Decimal128
__dpd_subtd3 (_Decimal128 a, _Decimal128 b)
¶_Decimal128
__bid_subtd3 (_Decimal128 a, _Decimal128 b)
¶These functions return the difference between b and a; that is, a - b.
_Decimal32
__dpd_mulsd3 (_Decimal32 a, _Decimal32 b)
¶_Decimal32
__bid_mulsd3 (_Decimal32 a, _Decimal32 b)
¶_Decimal64
__dpd_muldd3 (_Decimal64 a, _Decimal64 b)
¶_Decimal64
__bid_muldd3 (_Decimal64 a, _Decimal64 b)
¶_Decimal128
__dpd_multd3 (_Decimal128 a, _Decimal128 b)
¶_Decimal128
__bid_multd3 (_Decimal128 a, _Decimal128 b)
¶These functions return the product of a and b.
_Decimal32
__dpd_divsd3 (_Decimal32 a, _Decimal32 b)
¶_Decimal32
__bid_divsd3 (_Decimal32 a, _Decimal32 b)
¶_Decimal64
__dpd_divdd3 (_Decimal64 a, _Decimal64 b)
¶_Decimal64
__bid_divdd3 (_Decimal64 a, _Decimal64 b)
¶_Decimal128
__dpd_divtd3 (_Decimal128 a, _Decimal128 b)
¶_Decimal128
__bid_divtd3 (_Decimal128 a, _Decimal128 b)
¶These functions return the quotient of a and b; that is, a / b.
_Decimal32
__dpd_negsd2 (_Decimal32 a)
¶_Decimal32
__bid_negsd2 (_Decimal32 a)
¶_Decimal64
__dpd_negdd2 (_Decimal64 a)
¶_Decimal64
__bid_negdd2 (_Decimal64 a)
¶_Decimal128
__dpd_negtd2 (_Decimal128 a)
¶_Decimal128
__bid_negtd2 (_Decimal128 a)
¶These functions return the negation of a. They simply flip the sign bit, so they can produce negative zero and negative NaN.
_Decimal64
__dpd_extendsddd2 (_Decimal32 a)
¶_Decimal64
__bid_extendsddd2 (_Decimal32 a)
¶_Decimal128
__dpd_extendsdtd2 (_Decimal32 a)
¶_Decimal128
__bid_extendsdtd2 (_Decimal32 a)
¶_Decimal128
__dpd_extendddtd2 (_Decimal64 a)
¶_Decimal128
__bid_extendddtd2 (_Decimal64 a)
¶_Decimal32
__dpd_truncddsd2 (_Decimal64 a)
¶_Decimal32
__bid_truncddsd2 (_Decimal64 a)
¶_Decimal32
__dpd_trunctdsd2 (_Decimal128 a)
¶_Decimal32
__bid_trunctdsd2 (_Decimal128 a)
¶_Decimal64
__dpd_trunctddd2 (_Decimal128 a)
¶_Decimal64
__bid_trunctddd2 (_Decimal128 a)
¶These functions convert the value a from one decimal floating type to another.
_Decimal64
__dpd_extendsfdd (float a)
¶_Decimal64
__bid_extendsfdd (float a)
¶_Decimal128
__dpd_extendsftd (float a)
¶_Decimal128
__bid_extendsftd (float a)
¶_Decimal128
__dpd_extenddftd (double a)
¶_Decimal128
__bid_extenddftd (double a)
¶_Decimal128
__dpd_extendxftd (long double a)
¶_Decimal128
__bid_extendxftd (long double a)
¶_Decimal32
__dpd_truncdfsd (double a)
¶_Decimal32
__bid_truncdfsd (double a)
¶_Decimal32
__dpd_truncxfsd (long double a)
¶_Decimal32
__bid_truncxfsd (long double a)
¶_Decimal32
__dpd_trunctfsd (long double a)
¶_Decimal32
__bid_trunctfsd (long double a)
¶_Decimal64
__dpd_truncxfdd (long double a)
¶_Decimal64
__bid_truncxfdd (long double a)
¶_Decimal64
__dpd_trunctfdd (long double a)
¶_Decimal64
__bid_trunctfdd (long double a)
¶These functions convert the value of a from a binary floating type to a decimal floating type of a different size.
float
__dpd_truncddsf (_Decimal64 a)
¶float
__bid_truncddsf (_Decimal64 a)
¶float
__dpd_trunctdsf (_Decimal128 a)
¶float
__bid_trunctdsf (_Decimal128 a)
¶double
__dpd_extendsddf (_Decimal32 a)
¶double
__bid_extendsddf (_Decimal32 a)
¶double
__dpd_trunctddf (_Decimal128 a)
¶double
__bid_trunctddf (_Decimal128 a)
¶long double
__dpd_extendsdxf (_Decimal32 a)
¶long double
__bid_extendsdxf (_Decimal32 a)
¶long double
__dpd_extendddxf (_Decimal64 a)
¶long double
__bid_extendddxf (_Decimal64 a)
¶long double
__dpd_trunctdxf (_Decimal128 a)
¶long double
__bid_trunctdxf (_Decimal128 a)
¶long double
__dpd_extendsdtf (_Decimal32 a)
¶long double
__bid_extendsdtf (_Decimal32 a)
¶long double
__dpd_extendddtf (_Decimal64 a)
¶long double
__bid_extendddtf (_Decimal64 a)
¶These functions convert the value of a from a decimal floating type to a binary floating type of a different size.
_Decimal32
__dpd_extendsfsd (float a)
¶_Decimal32
__bid_extendsfsd (float a)
¶_Decimal64
__dpd_extenddfdd (double a)
¶_Decimal64
__bid_extenddfdd (double a)
¶_Decimal128
__dpd_extendtftd (long double a)
¶_Decimal128
__bid_extendtftd (long double a)
¶float
__dpd_truncsdsf (_Decimal32 a)
¶float
__bid_truncsdsf (_Decimal32 a)
¶double
__dpd_truncdddf (_Decimal64 a)
¶double
__bid_truncdddf (_Decimal64 a)
¶long double
__dpd_trunctdtf (_Decimal128 a)
¶long double
__bid_trunctdtf (_Decimal128 a)
¶These functions convert the value of a between decimal and binary floating types of the same size.
int
__dpd_fixsdsi (_Decimal32 a)
¶int
__bid_fixsdsi (_Decimal32 a)
¶int
__dpd_fixddsi (_Decimal64 a)
¶int
__bid_fixddsi (_Decimal64 a)
¶int
__dpd_fixtdsi (_Decimal128 a)
¶int
__bid_fixtdsi (_Decimal128 a)
¶These functions convert a to a signed integer.
long
__dpd_fixsddi (_Decimal32 a)
¶long
__bid_fixsddi (_Decimal32 a)
¶long
__dpd_fixdddi (_Decimal64 a)
¶long
__bid_fixdddi (_Decimal64 a)
¶long
__dpd_fixtddi (_Decimal128 a)
¶long
__bid_fixtddi (_Decimal128 a)
¶These functions convert a to a signed long.
unsigned int
__dpd_fixunssdsi (_Decimal32 a)
¶unsigned int
__bid_fixunssdsi (_Decimal32 a)
¶unsigned int
__dpd_fixunsddsi (_Decimal64 a)
¶unsigned int
__bid_fixunsddsi (_Decimal64 a)
¶unsigned int
__dpd_fixunstdsi (_Decimal128 a)
¶unsigned int
__bid_fixunstdsi (_Decimal128 a)
¶These functions convert a to an unsigned integer. Negative values all become zero.
unsigned long
__dpd_fixunssddi (_Decimal32 a)
¶unsigned long
__bid_fixunssddi (_Decimal32 a)
¶unsigned long
__dpd_fixunsdddi (_Decimal64 a)
¶unsigned long
__bid_fixunsdddi (_Decimal64 a)
¶unsigned long
__dpd_fixunstddi (_Decimal128 a)
¶unsigned long
__bid_fixunstddi (_Decimal128 a)
¶These functions convert a to an unsigned long. Negative values all become zero.
_Decimal32
__dpd_floatsisd (int i)
¶_Decimal32
__bid_floatsisd (int i)
¶_Decimal64
__dpd_floatsidd (int i)
¶_Decimal64
__bid_floatsidd (int i)
¶_Decimal128
__dpd_floatsitd (int i)
¶_Decimal128
__bid_floatsitd (int i)
¶These functions convert i, a signed integer, to decimal floating point.
_Decimal32
__dpd_floatdisd (long i)
¶_Decimal32
__bid_floatdisd (long i)
¶_Decimal64
__dpd_floatdidd (long i)
¶_Decimal64
__bid_floatdidd (long i)
¶_Decimal128
__dpd_floatditd (long i)
¶_Decimal128
__bid_floatditd (long i)
¶These functions convert i, a signed long, to decimal floating point.
_Decimal32
__dpd_floatunssisd (unsigned int i)
¶_Decimal32
__bid_floatunssisd (unsigned int i)
¶_Decimal64
__dpd_floatunssidd (unsigned int i)
¶_Decimal64
__bid_floatunssidd (unsigned int i)
¶_Decimal128
__dpd_floatunssitd (unsigned int i)
¶_Decimal128
__bid_floatunssitd (unsigned int i)
¶These functions convert i, an unsigned integer, to decimal floating point.
_Decimal32
__dpd_floatunsdisd (unsigned long i)
¶_Decimal32
__bid_floatunsdisd (unsigned long i)
¶_Decimal64
__dpd_floatunsdidd (unsigned long i)
¶_Decimal64
__bid_floatunsdidd (unsigned long i)
¶_Decimal128
__dpd_floatunsditd (unsigned long i)
¶_Decimal128
__bid_floatunsditd (unsigned long i)
¶These functions convert i, an unsigned long, to decimal floating point.
void
__bid_fixsdbitint (UBILtype
*r, int32_t rprec, _Decimal32 a)
¶void
__bid_fixddbitint (UBILtype
*r, int32_t rprec, _Decimal64 a)
¶void
__bid_fixtdbitint (UBILtype
*r, int32_t rprec, _Decimal128 a)
¶These functions convert a to bit-precise integer r, rounding toward zero. If rprec is positive, it converts to unsigned bit-precise integer and negative values all become zero, if rprec is negative, it converts to signed bit-precise integer. So far implemented for BID format only.
_Decimal32
__bid_floatbitintsd (UBILtype
*i, int32_t iprec)
¶_Decimal64
__bid_floatbitintdd (UBILtype
*i, int32_t iprec)
¶_Decimal128
__bid_floatbitinttd (UBILtype
*i, int32_t iprec)
¶These functions convert bit-precise integer i to decimal floating point. If iprec is positive, it is conversion from unsigned bit-precise integer, otherwise from signed bit-precise integer. So far implemented for BID format only.
int
__dpd_unordsd2 (_Decimal32 a, _Decimal32 b)
¶int
__bid_unordsd2 (_Decimal32 a, _Decimal32 b)
¶int
__dpd_unorddd2 (_Decimal64 a, _Decimal64 b)
¶int
__bid_unorddd2 (_Decimal64 a, _Decimal64 b)
¶int
__dpd_unordtd2 (_Decimal128 a, _Decimal128 b)
¶int
__bid_unordtd2 (_Decimal128 a, _Decimal128 b)
¶These functions return a nonzero value if either argument is NaN, otherwise 0.
There is also a complete group of higher level functions which correspond directly to comparison operators. They implement the ISO C semantics for floating-point comparisons, taking NaN into account. Pay careful attention to the return values defined for each set. Under the hood, all of these routines are implemented as
if (__bid_unordXd2 (a, b)) return E; return __bid_cmpXd2 (a, b);
where E is a constant chosen to give the proper behavior for NaN. Thus, the meaning of the return value is different for each set. Do not rely on this implementation; only the semantics documented below are guaranteed.
int
__dpd_eqsd2 (_Decimal32 a, _Decimal32 b)
¶int
__bid_eqsd2 (_Decimal32 a, _Decimal32 b)
¶int
__dpd_eqdd2 (_Decimal64 a, _Decimal64 b)
¶int
__bid_eqdd2 (_Decimal64 a, _Decimal64 b)
¶int
__dpd_eqtd2 (_Decimal128 a, _Decimal128 b)
¶int
__bid_eqtd2 (_Decimal128 a, _Decimal128 b)
¶These functions return zero if neither argument is NaN, and a and b are equal.
int
__dpd_nesd2 (_Decimal32 a, _Decimal32 b)
¶int
__bid_nesd2 (_Decimal32 a, _Decimal32 b)
¶int
__dpd_nedd2 (_Decimal64 a, _Decimal64 b)
¶int
__bid_nedd2 (_Decimal64 a, _Decimal64 b)
¶int
__dpd_netd2 (_Decimal128 a, _Decimal128 b)
¶int
__bid_netd2 (_Decimal128 a, _Decimal128 b)
¶These functions return a nonzero value if either argument is NaN, or if a and b are unequal.
int
__dpd_gesd2 (_Decimal32 a, _Decimal32 b)
¶int
__bid_gesd2 (_Decimal32 a, _Decimal32 b)
¶int
__dpd_gedd2 (_Decimal64 a, _Decimal64 b)
¶int
__bid_gedd2 (_Decimal64 a, _Decimal64 b)
¶int
__dpd_getd2 (_Decimal128 a, _Decimal128 b)
¶int
__bid_getd2 (_Decimal128 a, _Decimal128 b)
¶These functions return a value greater than or equal to zero if neither argument is NaN, and a is greater than or equal to b.
int
__dpd_ltsd2 (_Decimal32 a, _Decimal32 b)
¶int
__bid_ltsd2 (_Decimal32 a, _Decimal32 b)
¶int
__dpd_ltdd2 (_Decimal64 a, _Decimal64 b)
¶int
__bid_ltdd2 (_Decimal64 a, _Decimal64 b)
¶int
__dpd_lttd2 (_Decimal128 a, _Decimal128 b)
¶int
__bid_lttd2 (_Decimal128 a, _Decimal128 b)
¶These functions return a value less than zero if neither argument is NaN, and a is strictly less than b.
int
__dpd_lesd2 (_Decimal32 a, _Decimal32 b)
¶int
__bid_lesd2 (_Decimal32 a, _Decimal32 b)
¶int
__dpd_ledd2 (_Decimal64 a, _Decimal64 b)
¶int
__bid_ledd2 (_Decimal64 a, _Decimal64 b)
¶int
__dpd_letd2 (_Decimal128 a, _Decimal128 b)
¶int
__bid_letd2 (_Decimal128 a, _Decimal128 b)
¶These functions return a value less than or equal to zero if neither argument is NaN, and a is less than or equal to b.
int
__dpd_gtsd2 (_Decimal32 a, _Decimal32 b)
¶int
__bid_gtsd2 (_Decimal32 a, _Decimal32 b)
¶int
__dpd_gtdd2 (_Decimal64 a, _Decimal64 b)
¶int
__bid_gtdd2 (_Decimal64 a, _Decimal64 b)
¶int
__dpd_gttd2 (_Decimal128 a, _Decimal128 b)
¶int
__bid_gttd2 (_Decimal128 a, _Decimal128 b)
¶These functions return a value greater than zero if neither argument is NaN, and a is strictly greater than b.