Resultado extraño

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

Moderador: Sir Cilve Sinclair

Responder
Galileo
rst 0
Mensajes: 41
Registrado: Dom Ago 12, 2007 10:50 pm
Ubicación: Murcia (España)
Contactar:

Resultado extraño

Mensaje por Galileo » 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).

Avatar de Usuario
antoniovillena
Nonamed
Mensajes: 1162
Registrado: Dom Ene 09, 2011 8:55 am

Re: Resultado extraño

Mensaje por antoniovillena » 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

Galileo
rst 0
Mensajes: 41
Registrado: Dom Ago 12, 2007 10:50 pm
Ubicación: Murcia (España)
Contactar:

Re: Resultado extraño

Mensaje por Galileo » 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).

Avatar de Usuario
mcleod_ideafix
Johnny Jones
Mensajes: 3984
Registrado: Vie Sep 21, 2007 1:26 am
Ubicación: Jerez de la Frontera
Contactar:

Re: Resultado extraño

Mensaje por mcleod_ideafix » 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

Galileo
rst 0
Mensajes: 41
Registrado: Dom Ago 12, 2007 10:50 pm
Ubicación: Murcia (España)
Contactar:

Re: Resultado extraño

Mensaje por Galileo » 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).

speccy
Manic Miner
Mensajes: 275
Registrado: Jue Sep 06, 2007 4:20 pm

Re: Resultado extraño

Mensaje por speccy » 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.

Responder

¿Quién está conectado?

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