[BATCH]Problema con IF LSS

Iniciado por Segadorfelix, 23 Diciembre 2012, 22:12 PM

0 Miembros y 1 Visitante están viendo este tema.

Segadorfelix

Hola a todos.
Cuando ejecuto lo siguiente:
if -2233333333 LSS 10 echo menor que diez
debería salir "menor que diez", pero no lo ve como menor, ¿por que pasa esto y como arreglarlo?

$Edu$

Intenta poner ese numero negativo en una variable: set /a var=-223333333 y luego si haces if %var% LSS 10 (echo menor que diez)

Me dices, tendria que funcionar :P

Segadorfelix

Cita de: $Edu$ en 23 Diciembre 2012, 22:21 PM
Intenta poner ese numero negativo en una variable: set /a var=-223333333 y luego si haces if %var% LSS 10 (echo menor que diez)

Me dices, tendria que funcionar :P
Gracias, pero sale esto:
CitarNúmero no válido. Los números están limitados a 32 bits de precisión.

$Edu$

Cierto, porque batch tiene un limite, pero puedes capturar el numero que quieras en varias partes y hacer algo para que te funcione de todas formas, pero bueno, yo eligiria otro lenguaje para programar xD

Segadorfelix

Ok, creo que vbs no tiene ese problema.
Gracias $Edu$

Eleкtro

Te voy a mostrar la diferencia.

Limite Batch:
Código (dos) [Seleccionar]
if -999999999 LSS 10 (
Echo Es menor que 10
)

* 9 dígitos




Límite VBS:
Código (vb) [Seleccionar]
if -99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 < 10 then
Wscript.Echo "Menor que 10"
End If

* 308 dígitos




Límite Ruby:
Código (ruby) [Seleccionar]
If -999...(Así hasta más de UN MILLÓN DE DIGITOS) < 10
    print "Es menor de 10"
end

PD: Ruby no tiene límite alguno porque convierte los enteros.




Límite python:
* Lo mismo que Ruby.

Saludos.








Segadorfelix


Binary_Death

Una vez me tuve que enfrentar a ese problema. Me jodió bastante, sí.

Resulta que hice una función un poco engorrosa que te puede servir:


:_hst
setlocal enabledelayedexpansion
call :_strlen "%~1" & set/a n[0]=!errorlevel!
call :_strlen "%~2" & set/a n[1]=!errorlevel!
if %n[0]% EQU %n[1]% set "s_0=%~1" & set "s_1=%~2" & goto :_endhst
set/a hst=0,nhst=1
if %n[1]% GTR !n[%hst%]! set/a hst=1,nhst=0
set/a l_0=!n[%hst%]!-!n[%nhst%]!
shift/0 & call set s_0=%%~%hst% & call set s_1=%%~%nhst%
for /l %%_ in (1,1,%l_0%) do call set "s_1=0!s_1!"
:_endhst
for /f %%_ in ('"(echo:%s_0%&echo:%s_1%)|sort"') do set "hst=%%_"
endlocal & set "hst=%hst: =%" & exit /b

:_strlen
setlocal
set/a cnt=0
for /f "tokens=* eol=" %%_ in (
'"cmd /u /c echo:%~1|more"'
) do set/a cnt+=1
endlocal & exit /b %cnt%


Como puedes ver, recibe dos parámetros (los dos números) y devuelve en la variable "hst" el mayor.

Suerte, y tómatelo con calma, que ya te digo que es un poco engorrosa pero por lo menos funciona con los dígitos que sea necesario ;)

Segadorfelix

Cita de: Binary_Death en 24 Diciembre 2012, 19:18 PM
Una vez me tuve que enfrentar a ese problema. Me jodió bastante, sí.

Resulta que hice una función un poco engorrosa que te puede servir:


:_hst
setlocal enabledelayedexpansion
call :_strlen "%~1" & set/a n[0]=!errorlevel!
call :_strlen "%~2" & set/a n[1]=!errorlevel!
if %n[0]% EQU %n[1]% set "s_0=%~1" & set "s_1=%~2" & goto :_endhst
set/a hst=0,nhst=1
if %n[1]% GTR !n[%hst%]! set/a hst=1,nhst=0
set/a l_0=!n[%hst%]!-!n[%nhst%]!
shift/0 & call set s_0=%%~%hst% & call set s_1=%%~%nhst%
for /l %%_ in (1,1,%l_0%) do call set "s_1=0!s_1!"
:_endhst
for /f %%_ in ('"(echo:%s_0%&echo:%s_1%)|sort"') do set "hst=%%_"
endlocal & set "hst=%hst: =%" & exit /b

:_strlen
setlocal
set/a cnt=0
for /f "tokens=* eol=" %%_ in (
'"cmd /u /c echo:%~1|more"'
) do set/a cnt+=1
endlocal & exit /b %cnt%


Como puedes ver, recibe dos parámetros (los dos números) y devuelve en la variable "hst" el mayor.

Suerte, y tómatelo con calma, que ya te digo que es un poco engorrosa pero por lo menos funciona con los dígitos que sea necesario ;)
:o  :o Wow, Gracias Binary_Death, la subrutina  esta algo complicada, la analizare con cuidado.

Binary_Death