FLOATING_TO_DECIMAL(3C) | Standard C Library Functions | FLOATING_TO_DECIMAL(3C) |

floating_to_decimal, single_to_decimal, double_to_decimal, extended_to_decimal, quadruple_to_decimal - convert floating-point value to decimal record

#include <floatingpoint.h>voidsingle_to_decimal(single *px,decimal_mode *pm,

decimal_record *pd,fp_exception_field_type *ps);

voiddouble_to_decimal(double *px,decimal_mode *pm,

decimal_record *pd,fp_exception_field_type *ps);

voidextended_to_decimal(extended *px,decimal_mode *pm,

decimal_record *pd,fp_exception_field_type *ps);

voidquadruple_to_decimal(quadruple *px,decimal_mode *pm,

decimal_record *pd,fp_exception_field_type *ps);

The **floating_to_decimal** functions convert the
floating-point value at **px* into a decimal record at **pd*,
observing the modes specified in **pm* and setting exceptions in
**ps*. If there are no IEEE exceptions, **ps* will be zero.

If **px* is zero, infinity, or NaN, then only
*pd*→*sign* and *pd*→*fpclass* are set.
Otherwise *pd*→*exponent* and *pd*→*ds*
are also set so that

(sig)*(pd->ds)*10**(pd->exponent)

is a correctly rounded approximation to **px*, where
*sig* is +1 or −1, depending upon whether
*pd*→*sign* is 0 or −1. *pd*→*ds*
has at least one and no more than **DECIMAL_STRING_LENGTH**-1 significant
digits because one character is used to terminate the string with a
null.

*pd*→*ds* is correctly rounded according to the
IEEE rounding modes in *pm*→*rd*. **ps* has
*fp_inexact* set if the result was inexact, and has *fp_overflow*
set if the string result does not fit in *pd*→*ds* because
of the limitation **DECIMAL_STRING_LENGTH**.

If *pm*→*df* == *floating_form*, then
*pd*→*ds* always contains *pm*→*ndigits*
significant digits. Thus if **px* == 12.34 and
*pm*→*ndigits* == 8, then *pd*→*ds* will
contain 12340000 and *pd*→*exponent* will contain
−6.

If *pm*→*df* == *fixed_form* and
*pm*→*ndigits* >= 0, then the decimal value is rounded
at *pm*→*ndigits* digits to the right of the decimal point.
For example, if **px* == 12.34 and *pm*→*ndigits* ==
1, then *pd*→*ds* will contain 123 and
*pd*→*exponent* will be set to −1.

If *pm*→*df* == *fixed_form* and
*pm*→*ndigits*< 0, then the decimal value is rounded at
−*pm*→*ndigits* digits to the left of the decimal
point, and *pd*→*ds* is padded with trailing zeros up to
the decimal point. For example, if **px* == 12.34 and
*pm*→*n* digits == −1, then
*pd*→*ds* will contain 10 and
*pd*→*exponent* will be set to 0.

When *pm*→*df* == *fixed_form* and the value
to be converted is large enough that the resulting string would contain more
than **DECIMAL_STRING_LENGTH**−1 digits, then the string placed in
*pd*→*ds* is limited to exactly
**DECIMAL_STRING_LENGTH**-1 digits (by moving the place at which the
value is rounded further left if need be), *pd*→*exponent*
is adjusted accordingly and the overflow flag is set in **ps*.

*pd->more* is not used.

The econvert(3C), fconvert(3C), gconvert(3C),
printf(3C), and sprintf(3C) functions all use
**double_to_decimal()**.

See attributes(7) for descriptions of the following attributes:

ATTRIBUTE TYPE | ATTRIBUTE VALUE |

MT-Level | MT-Safe |

econvert(3C), fconvert(3C), gconvert(3C), printf(3C), sprintf(3C), attributes(7)

June 7, 2005 | OmniOS |