¿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>
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ónf
a un puntero vacíop
.