summaryrefslogtreecommitdiffstats
path: root/man3p/strtod.3p
diff options
context:
space:
mode:
Diffstat (limited to 'man3p/strtod.3p')
-rw-r--r--man3p/strtod.3p274
1 files changed, 274 insertions, 0 deletions
diff --git a/man3p/strtod.3p b/man3p/strtod.3p
new file mode 100644
index 000000000..151077681
--- /dev/null
+++ b/man3p/strtod.3p
@@ -0,0 +1,274 @@
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "STRTOD" P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" strtod
+.SH NAME
+strtod, strtof, strtold \- convert a string to a double-precision number
+.SH SYNOPSIS
+.LP
+\fB#include <stdlib.h>
+.br
+.sp
+double strtod(const char *restrict\fP \fInptr\fP\fB, char **restrict\fP
+\fIendptr\fP\fB);
+.br
+float strtof(const char *restrict\fP \fInptr\fP\fB, char **restrict\fP
+\fIendptr\fP\fB);
+.br
+long double strtold(const char *restrict\fP \fInptr\fP\fB, char **restrict\fP
+\fIendptr\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+These functions shall convert the initial portion of the string pointed
+to by \fInptr\fP to \fBdouble\fP, \fBfloat\fP, and
+\fBlong double\fP representation, respectively. First, they decompose
+the input string into three parts:
+.IP " 1." 4
+An initial, possibly empty, sequence of white-space characters (as
+specified by \fIisspace\fP())
+.LP
+.IP " 2." 4
+A subject sequence interpreted as a floating-point constant or representing
+infinity or NaN
+.LP
+.IP " 3." 4
+A final string of one or more unrecognized characters, including the
+terminating null byte of the input string
+.LP
+.LP
+Then they shall attempt to convert the subject sequence to a floating-point
+number, and return the result.
+.LP
+The expected form of the subject sequence is an optional plus or minus
+sign, then one of the following:
+.IP " *" 3
+A non-empty sequence of decimal digits optionally containing a radix
+character, then an optional exponent part
+.LP
+.IP " *" 3
+A 0x or 0X, then a non-empty sequence of hexadecimal digits optionally
+containing a radix character, then an optional binary
+exponent part
+.LP
+.IP " *" 3
+One of INF or INFINITY, ignoring case
+.LP
+.IP " *" 3
+One of NAN or NAN(\fIn-char-sequence_opt\fP), ignoring case in the
+NAN part, where:
+.sp
+.RS
+.nf
+
+\fBn-char-sequence:
+ digit
+ nondigit
+ n-char-sequence digit
+ n-char-sequence nondigit
+\fP
+.fi
+.RE
+.LP
+.LP
+The subject sequence is defined as the longest initial subsequence
+of the input string, starting with the first non-white-space
+character, that is of the expected form. The subject sequence contains
+no characters if the input string is not of the expected
+form.
+.LP
+If the subject sequence has the expected form for a floating-point
+number, the sequence of characters starting with the first
+digit or the decimal-point character (whichever occurs first) shall
+be interpreted as a floating constant of the C language, except
+that the radix character shall be used in place of a period, and that
+if neither an exponent part nor a radix character appears in
+a decimal floating-point number, or if a binary exponent part does
+not appear in a hexadecimal floating-point number, an exponent
+part of the appropriate type with value zero is assumed to follow
+the last digit in the string. If the subject sequence begins with
+a minus sign, the sequence shall be interpreted as negated. A character
+sequence INF or INFINITY shall be interpreted as an
+infinity, if representable in the return type, else as if it were
+a floating constant that is too large for the range of the return
+type. A character sequence NAN or NAN(\fIn-char-sequence_opt\fP) shall
+be interpreted as a quiet NaN, if
+supported in the return type, else as if it were a subject sequence
+part that does not have the expected form; the meaning of the
+\fIn\fP-char sequences is implementation-defined. A pointer to the
+final string is stored in the object pointed to by
+\fIendptr\fP, provided that \fIendptr\fP is not a null pointer.
+.LP
+If the subject sequence has the hexadecimal form and FLT_RADIX is
+a power of 2, the value resulting from the conversion is
+correctly rounded.
+.LP
+The
+radix character is defined in the program's locale (category \fILC_NUMERIC
+).\fP In the POSIX locale, or in a locale where the
+radix character is not defined, the radix character shall default
+to a period ( \fB'.'\fP ).
+.LP
+In other than the C \ or POSIX locales, other
+implementation-defined subject sequences may be accepted.
+.LP
+If the subject sequence is empty or does not have the expected form,
+no conversion shall be performed; the value of \fIstr\fP
+is stored in the object pointed to by \fIendptr\fP, provided that
+\fIendptr\fP is not a null pointer.
+.LP
+The
+\fIstrtod\fP() function shall not change the setting of \fIerrno\fP
+if successful.
+.LP
+Since 0 is returned on error and is also a valid return on success,
+an application wishing to check for error situations should
+set \fIerrno\fP to 0, then call \fIstrtod\fP(), \fIstrtof\fP(), or
+\fIstrtold\fP(), then check \fIerrno\fP.
+.SH RETURN VALUE
+.LP
+Upon successful completion, these functions shall return the converted
+value. If no conversion could be performed, 0 shall be
+returned, and \fIerrno\fP may be set to [EINVAL].
+.LP
+If the correct value is outside the range of representable values,
+\(+-HUGE_VAL, \(+-HUGE_VALF, or \(+-HUGE_VALL
+shall be returned (according to the sign of the value), and \fIerrno\fP
+shall be set to [ERANGE].
+.LP
+If the correct value would cause an underflow, a value whose magnitude
+is no greater than the smallest normalized positive
+number in the return type shall be returned and \fIerrno\fP set to
+[ERANGE].
+.SH ERRORS
+.LP
+These functions shall fail if:
+.TP 7
+.B ERANGE
+The value to be returned would cause overflow \ or underflow.
+.sp
+.LP
+These functions may fail if:
+.TP 7
+.B EINVAL
+No
+conversion could be performed.
+.sp
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+If the subject sequence has the hexadecimal form and FLT_RADIX is
+not a power of 2, and the result is not exactly representable,
+the result should be one of the two numbers in the appropriate internal
+format that are adjacent to the hexadecimal floating source
+value, with the extra stipulation that the error should have a correct
+sign for the current rounding direction.
+.LP
+If the subject sequence has the decimal form and at most DECIMAL_DIG
+(defined in \fI<float.h>\fP) significant digits, the result should
+be correctly rounded. If the subject
+sequence \fID\fP has the decimal form and more than DECIMAL_DIG significant
+digits, consider the two bounding, adjacent decimal
+strings \fIL\fP and \fIU\fP, both having DECIMAL_DIG significant digits,
+such that the values of \fIL\fP, \fID\fP, and \fIU\fP
+satisfy \fIL\fP <= \fID\fP <= \fIU\fP. The result should be one of
+the (equal or adjacent) values that would be obtained
+by correctly rounding \fIL\fP and \fIU\fP according to the current
+rounding direction, with the extra stipulation that the error
+with respect to \fID\fP should have a correct sign for the current
+rounding direction.
+.LP
+The changes to \fIstrtod\fP() introduced by the ISO/IEC\ 9899:1999
+standard can alter the behavior of well-formed
+applications complying with the ISO/IEC\ 9899:1990 standard and thus
+earlier versions of the base documents. One such example
+would be:
+.sp
+.RS
+.nf
+
+\fBint
+what_kind_of_number (char *s)
+{
+ char *endp;
+ double d;
+ long l;
+.sp
+
+ d = strtod(s, &endp);
+ if (s != endp && *endp == `\\0')
+ printf("It's a float with value %g\\n", d);
+ else
+ {
+ l = strtol(s, &endp, 0);
+ if (s != endp && *endp == `\\0')
+ printf("It's an integer with value %ld\\n", 1);
+ else
+ return 1;
+ }
+ return 0;
+}
+\fP
+.fi
+.RE
+.LP
+If the function is called with:
+.sp
+.RS
+.nf
+
+\fBwhat_kind_of_number ("0x10")
+\fP
+.fi
+.RE
+.LP
+an ISO/IEC\ 9899:1990 standard-compliant library will result in the
+function printing:
+.sp
+.RS
+.nf
+
+\fBIt's an integer with value 16
+\fP
+.fi
+.RE
+.LP
+With the ISO/IEC\ 9899:1999 standard, the result is:
+.sp
+.RS
+.nf
+
+\fBIt's a float with value 16
+\fP
+.fi
+.RE
+.LP
+The change in behavior is due to the inclusion of floating-point numbers
+in hexadecimal notation without requiring that either a
+decimal point or the binary exponent be present.
+.SH RATIONALE
+.LP
+None.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIisspace\fP() , \fIlocaleconv\fP() , \fIscanf\fP() , \fIsetlocale\fP()
+, \fIstrtol\fP() , the
+Base Definitions volume of IEEE\ Std\ 1003.1-2001, Chapter 7, Locale,
+\fI<float.h>\fP, \fI<stdlib.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .