En C estándar no hay forma portable de detectar errores al convertir strings a float
No portable way to detect string-to-float conversion errors in standard C
El estándar de C permite que strtod y funciones similares no establezcan errno si math_errhandling no lo indica, y además no exige reportar underflow. POSIX sí obliga a usar errno, pero eso podría ser no conforme. Peor aún: ante una entrada inválida, musl pone errno a EINVAL mientras glibc no, y la página man no lo documenta. El autor repasa las únicas formas correctas de comprobar overflow, underflow y fallos de conversión.
musl, on the other hand, does set errno to EINVAL, so this prints "22". This is completely undocumented on the linux man page.
- Joker_vD
Es bastante asombroso cómo la incapacidad histórica de los lenguajes de programación de uso común (desde FORTRAN hasta, digamos, Java/C#) para devolver dos valores de una llamada a función de forma ergonómica ha llevado a la gente a inventar todo tipo de APIs/contratos demenciales.
[double x, errno_t errno] = strtod(s, nullptr);
if (errno != 0) {
// ...
}
[x, _] = strtod(s, nullptr); // Cuando estás seguro de que el error es imposible o simplemente no te importa
En cambio, estamos atascados con "comprueba si el valor de retorno es -1 y, si lo es, comprueba la variable global errno" en el mejor de los casos, y con "la función no informa realmente de sus errores de forma fiable, así que no le pases datos malformados, me da igual" en el peor.
- Panzerschrek
Las funciones de análisis de números en C están fundamentalmente rotas, ya que dependen de la configuración regional. Hay muchos errores cuando uno analiza un número asumiendo que tiene punto decimal, pero luego en sistemas con una configuración regional diferente a la usada en la máquina del desarrollador puede que de repente sea una coma en lugar de un punto. Así que uno debería evitarlas casi siempre y usar std::from_chars (disponible en las nuevas versiones de C++) o alguna otra biblioteca de terceros.
- gucci-on-fleek
> las páginas de manual de linux para estas funciones literalmente no mencionan esto en absoluto
> el hecho de que la página de manual nunca haga ninguna nota de que esto sea una extensión ([…]) es realmente notable para mí.
> esto está completamente indocumentado en la página de manual de linux.
Los mantenedores de las páginas de manual de Linux son muy amables en mi experiencia, así que probablemente valga la pena reportarles esto [0] [1].
[0]: https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/...
- Kevin_Flynn
> No hay forma portable de detectar errores de conversión de string a float en C estándar
No hay solo 1 C estándar, hay muchos. La IA dice que hay 5.
Hay 5 estándares ISO C principales: C90, C99, C11, C17/C18 y C23. C89 es esencialmente el mismo estándar que C90 bajo su nombre ANSI, y C95 fue una enmienda en lugar de una edición principal separada. El más reciente es C23.
POSIX, como sabes, significa "Portable Operating System Interface".
> posix no le importa una mierda math_errhandling; siempre requiere que la implementación establezca errno si ocurre overflow o underflow.
Así que POSIX, la interfaz "Portable", especifica que los errores de underflow/overflow siempre se reportan.
El problema parece estar en el titular, no en la especificación.
- kazinator
¡No olvides la configuración regional! Si estás en la configuración regional incorrecta, strtod("3,4", ...) puede devolver 3.4, etc.