2 de enero de 2003

Convertir números Reales a Binarios

Algunas veces es necesario convertir números de punto flotante a binario, estas funciones que les presento me resulven este problema y las pongo a disposición de la comunidad para quien las pueda necesitar.

****************************************
*-- Conversión de números reales a binario
*-- Autor: Lic. Ramón Rodríguez Martínez
*-- País de procedencia México
*-- Forma de uso: X=FloatToBinary(nReal)
*-- Ejemplo: X=FloatToBinary(13.6876)
*-- Datestamp:17/12/2002
*-- Comentario:
*-- Los valores reprentativos son
*-- R(10Em)+R(10Em-1)+R(10Em-2)+..+R(10E0)+.+D(10E-1)+D(10E-2)..+D(10E-M)
*****************************************

CLEAR

?FloatToBinary(13.6875)

FUNCTION FloatToBinary(nValue)
  LOCAL pEntera, pDecimal
  *-- Tomamos primero la parte entera de la cantidad
  pEntera=INT(nValue)
  *-- Tomamos por separado la parte decimal
  pDecimal=ALLT(STR(nValue-pEntera,20,10)) &&margen de decimal
  *-- Y lo convierto a entero
  pDecimal=VAL(SUBSTR(pDecimal,AT('.',pDecimal)+1))
  *-- Finalmente regreso la cadena convertida a binario
  RETURN DecBin(pEntera)+"."+DecBinf(pDecimal)
ENDFUNC


FUNCTION DecBin(nDecimal)
  *------------------------------------------------
  * Transforma un número decimal a binario
  * RETORNA: Caracter
  *------------------------------------------------
  LOCAL lcBinario, lnResto
  lcBinario = ''
  DO WHILE nDecimal > 0
    lnResto = MOD(nDecimal,2)
    nDecimal = INT(nDecimal / 2)
    lcBinario = STR(lnResto,1) + lcBinario
  ENDDO
  RETURN lcBinario
ENDFUNC

FUNCTION DecBinF(nDecimal)
  *------------------------------------------------
  * Transforma un número decimal a binario
  * RETORNA: Caracter
  *------------------------------------------------
  LOCAL lcBinario, Res
  lcBinario = ''
  lcDecimal=ALLT(STR(nDecimal))
  DO WHILE VAL(lcDecimal)>0
    Res=VAL('0.'+lcdecimal)*2
    lcBinario=LcBinario+ALLT(STR(INT(Res)))
    lcDecimal=ALLT(STR(Res,20,10))
    lcDecimal=SUBSTR(lcDecimal,AT('.',lcdecimal)+1)
    *-- protegemos para cuando los valores se repiten
    *-- y de esta manera evitar un ciclo infinito
    *-- en estos casos se toman exclusivamente los primero 4 bits
    IF (VAL(lcDecimal)=ndecimal) Then
      EXIT
    ENDIF
  ENDDO
  RETURN lcBinario
ENDFUNC

Saludos

 Ramón Rodríguez Martínez

No hay comentarios. :

Publicar un comentario