PDA

Ver la versión completa : float=1.0 pero valor real de 0.007813



anibarro
16/01/2006, 04:40
Buenas, tengo un problema y por mas vueltas que le he dado, no encuentro solución, a ver si alguien puede ayudarme :$
Tengo un programilla funcionando bien usando SDL y floats. Cambié casi todos los floats por sll para ver si ganaba algo de velocidad, pero lo que enlentece son las funciones de acceso a la pantalla, así que lo cambié para usar el SDK oficial y ver que pasaba.
El problema es que no llegaba a mostrar nada por pantalla porque las funciones previas tenian resultado erroneos, cosa que no entendía porque sólo había tocado las funciones de entrada/salida, el resto estaba tal cual.

Entonces hice la prueba y resultó que los floats tenían valores que no se parecían a los que yo les daba. Por ejemplo, simplemente con hacer un sprintf(texto,"%f", 1.0), me escribe 0.007813, mientras que con sprintf(texto,"%d", 1); sale bien el 1.
Usar sll sería una solución, pero no puedo convertir sll en floats, porque pasa lo mismo, al hacer un sll2float(SLL_CONST_1), me sale 0.007813.
Estoy usando el DevkitARM17, arm-elf-gcc 4.0.2 y en el make tiene estas opciones:
-marm \
-mtune=arm920 \
-march=armv4t \
-mapcs \
-O2 \
-fomit-frame-pointer \
-finline-functions \
-fshort-enums \
-ffast-math \
-fshort-double \
-mstructure-size-boundary=8 \
-mno-thumb-interwork \
-Wno-multichar \
-I$(GPSDK)/include \
-I.

En el make para SDL se añade
-msoft-float
Pero aún quitándolo sigue funcionando bien y en cambio poniéndolo en el make del sdk oficial me da un montón de errore del tipo:
xxxx uses hardware FP, whereas engine.elf uses software FP

¿alguna idea? ¿Os pasa esto a vosotros?

bulbastre
16/01/2006, 04:52
Creí que se trataba de PS3 XDDDDDDDDDDDDDDDDDDDDDDDDDDDD

Petiso
16/01/2006, 06:08
Hola !

Mi experiencia con los floats:
- El error "xxxx uses hardware FP", me salia, y me parece que se me arreglo al poner el poner el devkitarm.

Por si quieres provar, al makefile tengo:

CFLAGS = -marm \
-march=armv4t \
-mapcs \
-O3 \
-fomit-frame-pointer \
-finline-functions \
-fshort-enums \
-ffast-math \
-fshort-double \
-mstructure-size-boundary=32 \
-mno-thumb-interwork \
-Wno-multichar \
-I\ ............

- sprintf's de floats: me estuve peleando MUCHOS dias con el sprintf, y no hhavia manera de que funcionara.
El problema no es de los floats o de los SLL, sino del srpintf.

Yo me hize un "printf" curte para debugear, pero no lo encuenro.

Era algo asi:

int num;
int num2;

num = f;
num2=(f-num)*1000.0;
sprintf(texto,"%i.%04i",num,num2);


Asi que si puedes, usa los SLL (son muucho mas rapidos).

Adios !

anibarro
16/01/2006, 06:19
vaya muchas gracias por ese truquillo del sprintf, ahora por lo menos ya puedo ir mirando donde estan los errores ^^ :brindis:

anibarro
16/01/2006, 22:03
bueno decir que gracias al truco del sprintf, al final era:
unsigned int num;
unsigned int num2;
num = real;
num2=(real-num)*10000.0;
sprintf(texto,"%u.%04u",num,num2);

he conseguido saber que lo que falla son las funciones sin y cos, asi que si alguna vez os pasa ya sabeis :( De momento lo he solucionado con una tabla de senos y cosenos compilando para x86

Petiso
16/01/2006, 22:59
Pos si pso si, el problema son los sin y cos :-p

Pos eso me pase a las sll ... que no dan este problema.

Adios.

Franxis
17/01/2006, 02:27
amateurs:
sprintf(texto,"%lf",1.0)
[wei5]

y en la compilación quita: -fshort-double
a mi daba problemas con el MAME

salu2

anibarro
17/01/2006, 03:19
jur...si ya dicen que el que sabe, sabe xD Menos mal que ademas enseña :P

Petiso
17/01/2006, 03:59
Pues va ser que no "veterano" ....... te muestra: 0.00783.

Adios !

anibarro
17/01/2006, 06:27
Petiso a mi me habia funcionado, pero me acabo de fijar que ahora tambien me funciona con sprintf(texto,"%f",1.0); por lo visto era cosa del -fshort-double...apostaria a que ahora ya funciona bien lo de sin y cos, voy a probar :rolleyes:
Efectivamente ahora ya funcionan bien xD todo culpa del -fshort-double, quitaloooo ;)

Petiso
17/01/2006, 06:44
Pos si pos si, era culpa del "-fshort-double".

Adios !

PD: Y mira que se ha preguntado veces aquí i en gp32x .... y nadie antes havia contestado.

Franxis
18/01/2006, 02:03
Incrédulo [wei5] :brindis: