Página 1 de 1

Resultado extraño

Publicado: Mar Jun 28, 2016 8:09 pm
por Galileo
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.

Re: Resultado extraño

Publicado: Mar Jun 28, 2016 8:29 pm
por antoniovillena
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

Re: Resultado extraño

Publicado: Mar Jun 28, 2016 9:44 pm
por Galileo
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.

Re: Resultado extraño

Publicado: Vie Jul 01, 2016 8:43 am
por mcleod_ideafix
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.

Re: Resultado extraño

Publicado: Vie Jul 01, 2016 5:43 pm
por Galileo
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.

Re: Resultado extraño

Publicado: Mar Ago 02, 2016 1:45 am
por speccy
Creo recordar un correo de los lectores de uno de los primeros números de MH donde ocurría algo parecido.