Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

164
Vistas
¿Por qué hay una diferencia en los resultados de cálculo entre literales y variables?

Al depurar un código C, encontré algunas extrañas inconsistencias en los cálculos dobles. Logré aislarlo en el siguiente ejemplo mínimo:

 #include <math.h> #include <stdio.h> int main() { float f = 268.6f; printf("Using variable float %.1f: %d\n", f, (unsigned char)(round(f))); printf("Using literal float %.1f: %d\n", 268.6f, (unsigned char)(round(268.6f))); double d = 268.6; printf("Using variable double %.1lf: %d\n", d, (unsigned char)(round(d))); printf("Using literal double %.1lf: %d\n", 268.6, (unsigned char)(round(268.6))); long double ld = 268.6L; printf("Using variable ldouble %.1llf: %d\n", ld, (unsigned char)(round(ld))); printf("Using literal ldouble %.1llf: %d\n", 268.6L, (unsigned char)(round(268.6L))); return 0; }

Que en mi máquina después de gcc weirdlit.c -lm -oweirdlit; ./weirdlit usando GCC versión 11.2.0 produce el siguiente resultado:

 Using variable float 268.6: 13 Using literal float 268.6: 255 Using variable double 268.6: 13 Using literal double 268.6: 255 Using variable ldouble 268.6: 13 Using literal ldouble 268.6: 255

Si bien los valores resultantes obviamente no tienen sentido (convertir valores de punto flotante en un carácter sin signo tiende a hacer eso), los valores no son el punto. Lo que me desconcertó es que los resultados son diferentes cuando se usa un valor literal en comparación con cuando se usa una variable con exactamente el mismo valor literal asignado. Pensando que puede ser una peculiaridad de optimización, lo probé de nuevo con gcc weirdlit.c -lm -O2 -oweirdlit; ./weirdlit . Resultó que tenía razón, la optimización cambió la salida y esta vez los resultados fueron consistentes.

 Using variable float 268.6: 255 Using literal float 268.6: 255 Using variable double 268.6: 255 Using literal double 268.6: 255 Using variable ldouble 268.6: 255 Using literal ldouble 268.6: 255

Como podemos ver, el resultado aquí (255) es el mismo que cuando se usaron los literales en la versión sin optimización. Esto nos muestra que GCC detectó correctamente que las variables no cambian entre la asignación y el uso y los valores literales se pueden sustituir en su lugar.

Lo que quiero saber es por qué sucede esto. ¿GCC usa algunas versiones diferentes de las funciones de la biblioteca matemática para calcular los valores de expresión durante la optimización que las que se usan más tarde en el tiempo de ejecución? ¿O hay alguna otra explicación para este fenómeno?

over 4 years ago · Santiago Trujillo
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda