2011-07-25 11 views
5

Tengo una función C que devuelve un tipo float.Devolver un 1.0f me da 1065353216

Cuando la función devuelve 1.0f, el receptor ve 1065353216, no 1.0.

Lo que quiero decir es lo siguiente:

float Function() 
{ 
    return 1.0f; 
} 

float value; 
value = Function(); 
fprintf(stderr, "Printing 1.0f: %f", value); 

Muestra:

1065353216 

Pero no:

1.0 
+3

¿Estas seguro que este es el código que está compilando/pruebas? Proporcione más contexto. –

+4

Curiosamente, 1065353216 es la representación entera de 1.0 (precisión simple IEEE). Tal vez su compilador o biblioteca estándar tiene un error, donde está interpretando% f como% d? – GameZelda

+1

Parece que '% d' fue reemplazado mágicamente por'% f', por lo que aquí no hay nada que se vea mal ... – Simon

Respuesta

15

a definir su función en un archivo de fuente y llame desde otro uno no proporcionar la firma haciendo el compilador piensa que la firma es int Function(), lo que conduce a resultados extraños.

Debe agregar la firma: float Function(); en el archivo donde está el printf.

Por ejemplo:

float Function(); 
float value; 
value = Function(); 
fprintf(stderr, "Printing 1.0f: %f", value); 
+1

Impresionante, no hubiera pensado en algo como esto ... Parece una buena suposición :) – Simon

+2

O podría usar un archivo de encabezado. –

+0

@James es el mismo problema si lo piensas: 'Function' devuelve lo que cree que es '1.0f' en algún registro (AX si recuerdo bien), luego el programa principal piensa que hay un' int' allí. El efecto es similar a cuando pasa un 'float' a' printf' con una cadena de formato "% d". – unkulunkulu

4

verificar su trabajo, ya que su aplicación es correcta.

Evidencia: http://codepad.org/QlHLEXPl

+6

... 'doble' verificarlo? : D –

+0

.. ¡es real! Más en serio, algunos compiladores/enlazadores/libs/lo que sea permiten compilaciones con printf/scanf, (y sus variantes), compatibilidad con FP deshabilitada (útil en h/w incrustado con RAM limitada). No sé lo que sucederá si tal compilación con FP deshabilitada llama a printf con un formato% f float? –

0

Mi turno de adivinar el problema:

Usted está bien:

  • editando el código fuente sin guardarlo
  • editar un archivo, pero la compilación y ejecutando otro
  • editando y compilando un archivo pero el funcionamiento de otra
  • hacer algo aún más complicado, pero similar :)
Cuestiones relacionadas