todas tipos programacion las funciones ejemplos declaracion datos codigos c floating-point integer

las - tipos de datos en programacion



¿Puedo comparar y agregar un número de punto flotante a un entero en C? (9)

¿Puedo comparar un número de punto flotante con un número entero?

¿Se comparará el flotador con los enteros en el código?

float f; // f has a saved predetermined floating-point value to it if (f >=100){__asm__reset...etc}

Además, podría ...

float f; int x = 100; x+=f;

Tengo que usar el valor de punto flotante f recibido de un sistema de referencia de actitud para ajustar un valor de posición x que controla una señal PWM para corregir la actitud.


¿Puedes comparar un flotador y un entero, claro? Pero el problema con el que se encontrará es la precisión. En la mayoría de las implementaciones de C / C ++, float e int tienen el mismo tamaño (4 bytes) y niveles de precisión muy diferentes. Ningún tipo puede contener todos los valores del otro tipo. Dado que un tipo no se puede convertir al otro tipo sin pérdida de precisión y los tipos no se pueden comparar de forma nativa, realizar una comparación sin considerar otro tipo dará como resultado la pérdida de precisión en algunos escenarios.

Lo que puede hacer para evitar la pérdida de precisión es convertir ambos tipos en un tipo que tenga la precisión suficiente para representar todos los valores de float e int. En la mayoría de los sistemas, el doble hará justamente eso. Así que lo siguiente usualmente hace una comparación sin pérdidas.

float f = getSomeFloat(); int i = getSomeInt(); if ( (double)i == (double)f ) { ... }


El primero funcionará bien. 100 se convertirán en un flotador, e IEE754 puede representar todos los enteros exactamente como flotadores, hasta aproximadamente 2 23 .

El segundo también funcionará, pero primero se convertirá en un entero, por lo que perderá precisión (eso es inevitable si está convirtiendo flotantes en enteros).


LHS define la precisión, por lo tanto, si su LHS es int y RHS es flotante, esto se traduce en una pérdida de precisión.

También eche un vistazo a CFAQ relacionados con FP


La aritmética de modo mixto (aritmética entre operandos de diferentes tipos y / o tamaños) es legal pero frágil. El estándar C define reglas para la promoción de tipos para convertir los operandos en una representación común. La promoción automática de tipos permite al compilador hacer algo sensible para las operaciones de modo mixto, pero "sensible" no significa necesariamente "correcto".

Para saber realmente si el comportamiento es correcto o no, primero debe comprender las reglas de promoción y luego comprender la representación de los tipos de datos. En términos muy generales:

  • los tipos más cortos se convierten en tipos más largos ( float a double , short a int , etc.)
  • los tipos enteros se convierten en tipos de punto flotante
  • las conversiones firmadas / no firmadas favorecen evitar la pérdida de datos (ya sea que la firma se convierta en unsigned o viceversa, depende del tamaño de los tipos respectivos)

Si el código como x > y (donde x e y tienen diferentes tipos) es correcto o incorrecto, depende de los valores que x e y puedan tomar. En mi experiencia, es una práctica común prohibir (a través del estándar de codificación) las conversiones de tipo implícitas. El programador debe considerar el contexto y realizar explícitamente las conversiones de tipo necesarias.


Sí, funcionará bien. Específicamente, el int se convertirá a flotar para los propósitos de la conversión. En el segundo, deberás lanzar a int, pero debería estar bien de lo contrario.


Sí, puedes compararlos, puedes hacer cálculos matemáticos sin tener mucho en cuenta cuál es cuál, en la mayoría de los casos. Pero solo la mayoría. El gran error es que puedes verificar f<i etc. pero no debes verificar f==i . Un entero y un flotante que "deberían" ser idénticos en valor no son necesariamente idénticos.


Sí, ya veces hará exactamente lo que esperas.

Como han señalado los demás, la comparación, por ejemplo, 1.0 == 1 funcionará, porque el número entero 1 es de tipo de conversión para double (no float ) antes de la comparación.

Sin embargo, otras comparaciones pueden no.


Sobre eso, la notación 1.0 es de tipo doble, por lo que la comparación se realiza en doble por tipo de reglas de promoción, como se dijo anteriormente. 1.f o 1.0f es de tipo float y la comparación se habría hecho en float. Y habría funcionado tan bien como dijimos que 2 ^ 23 primeros enteros son representables en un flotador.


Ya que se identificó como no familiarizado con las sutilezas de los números de punto flotante, lo remitiré a este excelente artículo de David Goldberg: Lo que todo científico informático debe saber sobre la aritmética de punto flotante ( reprint en Sun).

Después de haberte asustado por eso, la realidad es que la mayor parte del tiempo, el punto flotante es una gran ayuda para realizar los cálculos. Y los compiladores e idiomas modernos (incluido C) manejan las conversiones con sensatez para que no tenga que preocuparse por ellas. A menos que hagas.

Los puntos planteados sobre la precisión son ciertamente válidos. Un flotador IEEE efectivamente tiene solo 24 bits de precisión, que es menor que un entero de 32 bits. El uso del double para cálculos intermedios empujará todo el redondeo y la pérdida de precisión a la conversión de vuelta a float o int .