es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué el mismo código ensamblador generado no produce la misma salida?

Código de muestra (t0.c):


#include <stdio.h> float f(float a, float b, float c) attribute((noinline)); float f(float a, float b, float c) { return a * c + b * c; } int main(void) { void* p = V; printf("%a\n", f(4476.0f, 20439.0f, 4915.0f)); return 0; }

Invocación y ejecución (a través de godbolt.org):


icc 2021.1.2 en Linux en x86-64 $ icc t0.c -fp-model=fast -O3 -DV=f 0x1.d32322p+26 $ icc t0.c -fp-model=fast -O3 -DV=0 0x1.d32324p+26

El código ensamblador generado es el mismo: https://godbolt.org/z/osra5jfYY.

¿Por qué el mismo código ensamblador generado no produce la misma salida?

¿Por qué importa void* p = f;?</stdio.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La salida para el mismo código ensamblador generado es diferente porque los valores de las operaciones de punto flotante pueden variar según el modelo de punto flotante específico utilizado por el compilador. En este caso, se usa la opción -fp-model=fast que sacrifica la precisión por velocidad. Esto puede causar errores de redondeo y diferencias en la salida incluso con el mismo código ensamblador generado.

    La asignación void* p = f; no importa en el código de muestra dado ya que no se usa en ningún otro lugar. Simplemente asigna la dirección de la función f a un puntero vacío p.

Comments are closed.