Resultado extraño

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Resultado extraño

Notapor Galileo el Mar Jun 28, 2016 8:09 pm

Tengo el siguiente programa que pretende resolver el problema denominado "Casting out nines" http://rosettacode.org/wiki/Casting_out_nines:

Código: Seleccionar todo
10 LET Base=10
20 LET N=2
30 LET c1=0
40 LET c2=0
50 LET k=1
60 IF k>=(Base^N) THEN GO TO 150
70 LET c1=c1+1
80 IF FN m(k,Base-1)=FN m(k*k,Base-1) THEN LET c2=c2+1: PRINT k;" ";
90 LET k=k+1
100 GO TO 60
150 PRINT '"Trying ";c2;" numbers instead of ";c1;" numbers saves ";100-(c2/c1)*100;"%"
160 STOP
170 DEF FN m(a,b)=(a/b-(INT (a/b)))*b: REM Mod function


El resultado no es el esperado, se salta números. El problema radica en la comparación de la línea 80. Si pruebo a hacer
Código: Seleccionar todo
FN m(10,9)
el resultado es 1. Lo mismo con
Código: Seleccionar todo
FN m(100,9)
. Pero cuando comparo ambos resultados (1=1) el resultado es... 0 (¡falso!). He probado a guardar el resultado de ambas llamadas en sendas variables. Las compruebo y, efectivamente, obtengo 1 en cada una. Pero cuando confronto ambas variables (a=b) el resultado vuelve a ser 0 (???). Si asigno a la variable A el valor 1 y hago lo mismo con la variable B, funciona correctamente (A=B -> 1). Lo he probado con SE BASIC y pasa exactamente igual. Sin embargo, Sam BASIC sí ofrece el resultado correcto.
El Spectrum no necesita ser actualizado cada equis años, y SIEMPRE es compatible consigo mismo (chúpate esa, BG).
Galileo
rst 0
 
Mensajes: 38
Registrado: Dom Ago 12, 2007 10:50 pm
Ubicación: Murcia (España)

Re: Resultado extraño

Notapor antoniovillena el Mar Jun 28, 2016 8:29 pm

Aunque te muestre un entero, tu función MOD el resultado que te da es un flotante. Y 0.99999999999 no es igual a 1.000000001. Prueba con esta función MOD, verás como te funciona:

DEF FN m(a, b)= a-INT(a/b)*b
Imagen
Avatar de Usuario
antoniovillena
Nonamed
 
Mensajes: 1153
Registrado: Dom Ene 09, 2011 9:55 am

Re: Resultado extraño

Notapor Galileo el Mar Jun 28, 2016 9:44 pm

Muchas gracias, tu definición funciona perfectamente. La verdad es que todas estas peculiaridades me vuelven bastante loco. No se si sería mejor que programara en Sam BASIC y, después de comprobar que el programa funcione, pasarlo a Basinc.
El Spectrum no necesita ser actualizado cada equis años, y SIEMPRE es compatible consigo mismo (chúpate esa, BG).
Galileo
rst 0
 
Mensajes: 38
Registrado: Dom Ago 12, 2007 10:50 pm
Ubicación: Murcia (España)

Re: Resultado extraño

Notapor mcleod_ideafix el Vie Jul 01, 2016 8:43 am

Galileo escribió:Muchas gracias, tu definición funciona perfectamente

No es una pecualiaridad del BASIC... es que la función que tú has definido no es la función MOD. a/b-INT (a/b) si la aplicas a, por ejemplo, el 3 y el 2, te da: 3/2-INT (3/2). 3/2 es 1.5 INT (3/2) es 1, así que tu función devuelve 0.5. Ese DEF FN que pusiste tampoco te hubiera funcionado en otro BASIC. La manera correcta es como te ha puesto Antonio.
Web: ZX Projects | Twitter: @zxprojects
Avatar de Usuario
mcleod_ideafix
Johnny Jones
 
Mensajes: 3964
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera

Re: Resultado extraño

Notapor Galileo el Vie Jul 01, 2016 5:43 pm

Perdona, macleod_ideafix, pero la definición era
Código: Seleccionar todo
(a/b-(INT (a/b)))*b
. En tu ejemplo, (3/2-(INT(3/2)))*2, lo que daría (1.5-1)*2, o sea, 0.5*2, que debería dar, en buena lógica (y en buenas matemáticas) 1.
El Spectrum no necesita ser actualizado cada equis años, y SIEMPRE es compatible consigo mismo (chúpate esa, BG).
Galileo
rst 0
 
Mensajes: 38
Registrado: Dom Ago 12, 2007 10:50 pm
Ubicación: Murcia (España)

Re: Resultado extraño

Notapor speccy el Mar Ago 02, 2016 1:45 am

Creo recordar un correo de los lectores de uno de los primeros números de MH donde ocurría algo parecido.
speccy
Manic Miner
 
Mensajes: 269
Registrado: Jue Sep 06, 2007 4:20 pm


Volver a Programación y nuevos desarrollos

¿Quién está conectado?

Usuarios navegando este Foro: No hay usuarios registrados visitando el Foro y 2 invitados