Copyright (c) 2005, Sun Microsystems, Inc. All Rights Reserved.
The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License.
You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing. See the License for the specific language governing permissions and limitations under the License.
When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
#include <floatingpoint.h> void single_to_decimal(single *px, decimal_mode *pm, decimal_record *pd, fp_exception_field_type *ps);
void double_to_decimal(double *px, decimal_mode *pm, decimal_record *pd, fp_exception_field_type *ps);
void extended_to_decimal(extended *px, decimal_mode *pm, decimal_record *pd, fp_exception_field_type *ps);
void quadruple_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)