Previous: Parsing of Integers, Up: Parsing of Numbers


20.11.2 Parsing of Floats

The ‘str’ functions are declared in stdlib.h and those beginning with ‘wcs’ are declared in wchar.h. One might wonder about the use of restrict in the prototypes of the functions in this section. It is seemingly useless but the ISO C standard uses it (for the functions defined there) so we have to do it as well.

— Function: double strtod (const char *restrict string, char **restrict tailptr)

The strtod (“string-to-double”) function converts the initial part of string to a floating-point number, which is returned as a value of type double.

This function attempts to decompose string as follows:

If the string is empty, contains only whitespace, or does not contain an initial substring that has the expected syntax for a floating-point number, no conversion is performed. In this case, strtod returns a value of zero and the value returned in *tailptr is the value of string.

In a locale other than the standard "C" or "POSIX" locales, this function may recognize additional locale-dependent syntax.

If the string has valid syntax for a floating-point number but the value is outside the range of a double, strtod will signal overflow or underflow as described in Math Error Reporting.

strtod recognizes four special input strings. The strings "inf" and "infinity" are converted to ∞, or to the largest representable value if the floating-point format doesn't support infinities. You can prepend a "+" or "-" to specify the sign. Case is ignored when scanning these strings.

The strings "nan" and "nan(chars...)" are converted to NaN. Again, case is ignored. If chars... are provided, they are used in some unspecified fashion to select a particular representation of NaN (there can be several).

Since zero is a valid result as well as the value returned on error, you should check for errors in the same way as for strtol, by examining errno and tailptr.

— Function: float strtof (const char *string, char **tailptr)
— Function: long double strtold (const char *string, char **tailptr)

These functions are analogous to strtod, but return float and long double values respectively. They report errors in the same way as strtod. strtof can be substantially faster than strtod, but has less precision; conversely, strtold can be much slower but has more precision (on systems where long double is a separate type).

These functions have been GNU extensions and are new to ISO C99.

— Function: double wcstod (const wchar_t *restrict string, wchar_t **restrict tailptr)
— Function: float wcstof (const wchar_t *string, wchar_t **tailptr)
— Function: long double wcstold (const wchar_t *string, wchar_t **tailptr)

The wcstod, wcstof, and wcstol functions are equivalent in nearly all aspect to the strtod, strtof, and strtold functions but it handles wide character string.

The wcstod function was introduced in Amendment 1 of ISO C90. The wcstof and wcstold functions were introduced in ISO C99.

— Function: double atof (const char *string)

This function is similar to the strtod function, except that it need not detect overflow and underflow errors. The atof function is provided mostly for compatibility with existing code; using strtod is more robust.

The GNU C library also provides ‘_l’ versions of these functions, which take an additional argument, the locale to use in conversion. See Parsing of Integers.