c++ - from - extern c ejemplo
¿Qué significa 1.#INF00,-1.#IND00 y-1.#IND significa? (3)
Estoy jugando con un código C usando flotadores, y obtengo 1. # INF00, -1. # IND00 y -1. # IND cuando intento imprimir flotadores en la pantalla. ¿Qué significan esos valores?
Creo que 1. # INF00 significa infinito positivo, pero ¿qué pasa con -1. # IND00 y -1. # IND? También vi a veces este valor: 1. $ NaN que no es un número, pero ¿qué causa esos valores extraños y cómo pueden ayudarme con la depuración?
Estoy usando MinGW que creo que utiliza la representación IEEE 754 para los números de punto flotante.
¿Alguien puede enumerar todos esos valores inválidos y qué significan?
De IEEE excepciones de coma flotante en C ++ :
Esta página responderá las siguientes preguntas.
- Mi programa acaba de imprimir 1. # IND o 1. # INF (en Windows) o nan o inf (en Linux). ¿Que pasó?
- ¿Cómo puedo saber si un número es realmente un número y no un NaN o un infinito?
- ¿Cómo puedo encontrar más detalles en tiempo de ejecución sobre tipos de NaN e infinidades?
- ¿Tiene algún código de muestra para mostrar cómo funciona esto?
- ¿Dónde puedo aprender más?
Estas preguntas tienen que ver con excepciones de coma flotante. Si obtienes algún resultado extraño no numérico donde esperas un número, has excedido los límites finitos de la aritmética de punto flotante o has pedido algún resultado indefinido. Para mantener las cosas simples, me limitaré a trabajar con el tipo de doble punto flotante. Observaciones similares son válidas para los tipos de flotación.
Depuración 1. # IND, 1. # INF, nan e inf
Si su operación generaría un número positivo mayor que el que podría almacenarse en un doble, la operación devolverá 1. # INF en Windows o inf en Linux. De forma similar, su código devolverá -1. # INF o -inf si el resultado sería un número negativo demasiado grande para almacenarlo en un doble. Dividir un número positivo por cero produce un infinito positivo y dividir un número negativo por cero produce un infinito negativo. El código de ejemplo al final de esta página demostrará algunas operaciones que producen infinitos.
Algunas operaciones no tienen sentido matemático, como tomar la raíz cuadrada de un número negativo. (Sí, esta operación tiene sentido en el contexto de números complejos, pero un doble representa un número real y, por lo tanto, no hay un doble para representar el resultado.) Lo mismo es cierto para los logaritmos de los números negativos. Tanto sqrt (-1.0) como log (-1.0) devolverían un NaN, el término genérico para un "número" que no es "un número". Windows muestra un NaN como -1. # IND ("IND" para "indeterminado") mientras que Linux muestra nan. Otras operaciones que devolverían un NaN incluyen 0/0, 0 * ∞ y ∞ / ∞. Consulte el ejemplo de código a continuación para ver ejemplos.
En resumen, si obtiene 1. # INF o inf, busque desbordamiento o división por cero. Si obtiene 1. # IND o nan, busque operaciones ilegales. Tal vez simplemente tienes un error. Si es más sutil y tienes algo que es difícil de calcular, consulta Cómo evitar el desbordamiento, el subdesbordamiento y la pérdida de precisión. Ese artículo da trucos para calcular resultados que tienen un desbordamiento de pasos intermedio si se computan directamente.
Para aquellos de ustedes en un entorno .NET, lo siguiente puede ser una forma práctica de filtrar no números (este ejemplo está en VB.NET, pero probablemente sea similar en C #):
If Double.IsNaN(MyVariableName) Then
MyVariableName = 0 '' Or whatever you want to do here to "correct" the situation
End If
Si intenta utilizar una variable que tiene un valor NaN, obtendrá el siguiente error:
El valor era demasiado grande o demasiado pequeño para un decimal.
Su pregunta "¿qué son?" Ya está respondida anteriormente.
Sin embargo, en cuanto a la depuración (su segunda pregunta), y en el desarrollo de bibliotecas en las que desea verificar valores de entrada especiales, puede encontrar las siguientes funciones útiles en Windows C ++:
_isnan (), _isfinite () y _fpclass ()
En Linux / Unix debe encontrar isnan (), isfinite (), isnormal (), isinf (), fpclassify () útil (y es posible que deba vincularse con libm utilizando el indicador del compilador -lm).