Resultado no intuitivo de la asignación de un número de doble precisión a una variable int en C

Resultado no intuitivo de la asignación de un número de doble precisión a una variable int en C


¿Podría alguien darme una explicación de por qué obtengo dos números
diferentes, resp. 14 y 15, como resultado del siguiente código?


#include <stdio.h>  
int main()
{
double Vmax = 2.9;
double Vmin = 1.4;
double step = 0.1;
double a =(Vmax-Vmin)/step;
int b = (Vmax-Vmin)/step;
int c = a;
printf("%d %d",b,c); // 14 15, why?
return 0;
}

Espero obtener 15 en ambos casos, pero parece que me faltan algunos fundamentos del idioma.


No estoy seguro de si es relevante, pero estaba haciendo la prueba en CodeBlocks. Sin embargo, si escribo las mismas líneas de código en algún compilador en línea (este por ejemplo) obtengo una respuesta de 15 para las dos variables impresas.


Respuestas:



Aparte de los problemas habituales de punto flotante, las rutas de cálculo a b y c se llegan de diferentes maneras. c se calcula guardando primero el valor como double a .


double a =(Vmax-Vmin)/step;
int b = (Vmax-Vmin)/step;
int c = a;


C permite que se calculen las matemáticas intermedias de punto flotante utilizando tipos más amplios. Comprueba el valor de FLT_EVAL_METHOD de <float.h> .



OP informó 2


Guardando el cociente en double a = (Vmax-Vmin)/step; , la precisión se fuerza a double mientras que int b = (Vmax-Vmin)/step; podría calcularse como long double .


Esta sutil diferencia resulta de (Vmax-Vmin)/step (calculado tal vez como long double ) siendo guardado como un double versus permanecer un long double . Uno como 15 (o justo por encima), y el otro justo por debajo de 15. int el truncamiento amplifica esta diferencia a 15 y 14.


En otro compilador, los resultados pueden haber sido los mismos debido a FLT_EVAL_METHOD < 2 u otras características de coma flotante.



Conversión a int de un número de punto flotante es severo con números cercanos a un número entero. A menudo es mejor round() o lround() . La mejor solución depende de la situación.