# Valor absoluto de un numero en pic



## EVA (Nov 18, 2008)

Buenas,

tengo una duda, hay alguna instruccion para pasar un numero a absoluto, es decir, que siempre sea positivo? 
Muchas gracias!


----------



## Moyano Jonathan (Nov 18, 2008)

si en c de ccs usando la librería math..h

si tu variable es  x: para sacar el valor absoluto es f= abs(x)


----------



## Leon Elec (Nov 18, 2008)

¿Para qué familia de pic estás hablando y en que lenguaje?

Los pic de gama media y baja, no manejan negativos y flotante. Para saber si una resta es negativa, te tiene que fijar en el bit C del registro Status. Pero al fin y al cabo, el resultado es un valor absoluto.


----------



## Ardogan (Nov 19, 2008)

Los tipos con signo tiene el bit de signo en el MSB (bit más significativo).
Poniendo a 0 ese bit ya tenes el valor absoluto.
Ojo!, dije tipos con signo, si a un unsigned char (tipo sin signo) le cambiás el MSB vas a cambiar el valor y no el signo = problemas.


----------



## pic-man (Nov 19, 2008)

Ardogan tiene razón. Si manejas números negativos en el pic y programas en ensamblador en un número negativo el MSB siempre será igual a 1. Para obtener el valor absoluto simplemente revisas este bit y si es igual a 1 sacas su complemento a 2. Con eso tendrás el mismo número pero positivo.

Recordemos que el complemento a 2 se realiza complementando el valor de un número y después sumandole 1. En ensamblador esto se hace asi:
	
	



```
comf    NUMERO,f
   incf    NUMERO,f
```
Donde NUMERO tiene el valor que deseamos pasar a positivo.


----------



## Ardogan (Nov 19, 2008)

Cierto Pic-man... menos mal que aclaraste lo del complemento a 2. Si es un número complemento a 2 y uno solo le pone a 0 el bit de signo sonamos, no es el valor absoluto, hay que hacer el complemento a 2 como decís.
Si se trata de un float creo que con el bit de signo solamente alcanza no?


----------



## ELIUSM (Nov 20, 2008)

Hm, pero se me ocurre que en pics de gama baja igual se puede hacer, pero se complica si trabajas con números más grandes que 255. Y en general es complicado. Te explico lo que me imagino yo:

Si haces por ejemplo, 10 - 20, el resultado será 245, pero esto no es cierto, verdad? Entonces:
Una vez hecha la resta, revisas el Bit C del Status para ver si el resultado se hizo negativo. Para llegar al resultado correcto debes tomar el resultado que acabas de encontrar (245), y haces "255 - 245" = 10, pero por haber revisado el bit C del Status y haber visto que está en 1, ya sabrás que ese 10 es negativo.
... pero no te interesa que sea negativo, nisiquiera revises el C del Status. Entonces el 10 que acabas de obtener... es simplemente el resultado en valor absoluto.

Resumen:
Paso 1:
10 - 20 = 245

Paso 2:
255 - resultado anterior (245) = 10, siempre positivo!

Se entiende lo que dije?
Es una idea nomás...

Saludos!


----------



## Leon Elec (Nov 21, 2008)

El modo de hacer una resta en assembler es:

restas los dos valores, revisas el bit C del STATUS, si este es 0 realizas el complemento y luego le sumas 1, por el contrario, si el bit C es 1, el resultado es positivo y no hay que hacer nada.

Les adjunto una rutina que cree para restar 2 números de 8 bit. Luego subo una rutina para restar 2 números de 32 bit en pic de 8 bit.


----------



## EVA (Nov 21, 2008)

muchas gracias a todos!


----------



## instru_neofito (Ago 13, 2009)

esa restas de 10-20=245
no esta bien el resultado

en realidad es 456 y no da


----------



## instru_neofito (Ago 13, 2009)

jaja 246

asi que abria que restarle 256 mmm.. pero en assembler es complicado jaja


----------

