2011-12-20 11 views
7

Duplicar posibles:
Why does gdb evaluate sqrt(3) to 0?GDB da salida extraña al utilizar funciones math.h

C novato aquí. Debe haber una explicación obvia de por qué gdb da salidas extrañas al tratar de usar funciones math.h en línea. Por ejemplo, se supone que la función fabs a continuación toma el valor absoluto y devuelve un doble.

(gdb) p cos(2*3.141/4) 
$13 = 1073291460 
(gdb) p fabs(-3)  
$14 = 0 
(gdb) p fabs(3) 
$15 = 0 
(gdb) p fabs(3.333) 
$16 = 1 
(gdb) p (double) fabs(-3.234) 
$17 = 1 
(gdb) p (double) fabs((double)-3.234) 
$18 = 1 
(gdb) p ((double(*)(double))fabs)(-3) 
$19 = 682945 

El código que estoy usando math.h ha incluido, y el código real aparece para ejecutar correctamente, aunque el mismo código colocado en línea en GDB produce resultados extraños. Podría ignorarlo, pero parece una buena oportunidad de aprendizaje.

+0

El moderador puede sentirse libre para cerrar (por ejemplo, eliminar) esto si es necesario, ya que es una víctima. – ggkmath

Respuesta

8

(Ref: http://lists.gnu.org/archive/html/gdb/2009-12/msg00004.html)

gdb no se encuentra la información de depuración de la función cos, y por lo tanto asuma que es una función int cos(...), por lo que los valores no se devuelve correctamente (especialmente en x86 como los registros para almacenar. retorno de punto flotante y retorno entero son diferentes).

Esto podría ser resuelto en torno especificando el tipo:

(gdb) p ((double(*)(double))cos) (1.0) 
$18 = 0.54030230586813977 
+0

¿No hay forma de proporcionarle a gdb la información sin el tipo difícil de leer y difícil de escribir? Pensé que compilar con '-g' era suficiente para evitar este tipo de problemas. – Juan

+0

Si es importante, compilé con -g y no incluí ningún indicador de optimización. – ggkmath

+0

Gracias KennyTM. Pensé que algo así podría estar sucediendo, pero mi experimentación al usar '(double)' con 'fabs()' no pareció ayudar (ver mi última edición a la pregunta anterior). – ggkmath

Cuestiones relacionadas