[Com] float v2 (Suma,resta,multiplicacion y division decimal)

Iniciado por LauBuru, 4 Julio 2010, 12:18 PM

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

LauBuru

En esta segunda version e ampliado el comando hasta las cuatro acciones aritmeticas basicas (Sumar, restar, multiplicar y dividir) con numeros reales, quiero avisar antes de que se me hechen al cuello de que el segundo decimal no suele ser totalmente exacto hay una variacion respecto a una calculadora, esto se deve a que CMD tiende a redondear los resultados cuando la operacion no devuelve un numero entero por lo demas va medianamente bien, os dejo el codigo para que le hecheis un vistazo.

Sintaxis:

float xx,yy + xx,yy
float xx,yy - xx,yy
float xx,yy * xx,yy
float xx,yy / xx,yy


Código (dos) [Seleccionar]

@echo on
set operador=%3
set /a cont=-1
set /a cont2=-1
set /a cont3=-1
for /f "tokens=*" %%a in ('set /a "operando1=%1,%2"') do ( set decimales1=%%a)
for /f "tokens=*" %%b in ('set /a "operando2=%4,%5"') do (set decimales2=%%b)
for /f "tokens=*" %%c in ('echo %1') do ( set entero1=%%c)
for /f "tokens=*" %%d in ('echo %4') do ( set entero2=%%d)
if "^%operador%s" == "^+s" (goto sumar)
if "^%operador%s" == "^-s" (goto restar)
if "^%operador%s" == "^*s" (goto multiplicar)
if "^%operador%s" == "^/s" (goto dividir)

:sumar
set /a RsEntero=%entero1% %operador% %entero2%
set /a RsDecimal=%decimales1% %operador% %decimales2%
if "100" GEQ "%RsDecimal%" (set /a "RsEntero=%RsEntero% + %RsDecimal:~0,1%")
set "resultado=%RsEntero%,%RsDecimal%"
echo %resultado%
exit /b %resultado%

:restar
set /a RsEntero=%entero1% %operador% %entero2%
set /a RsDecimal=%decimales1% %operador% %decimales2%
if "%decimales1%" LSS "%decimales2%" (set "decimales1=1%decimales1%" & set /a "entero1=%entero1%-1" & goto uno)
if "%decimales2%" LSS "%decimales1%" (set "decimales2=1%decimales2%" & set /a "entero2=%entero2%-1" & goto dos)

:uno
set /a RsDecimal=%decimales1%- %decimales2%
set /a RsEntero=%entero2%%operador%%entero1%
set resultado=%RsEntero%,%RsDecimal%
echo %resultado%
exit /b %resultado%

:dos
set /a RsDecimal=%decimales2%- %decimales1%
set /a RsEntero=%entero2%%operador%%entero1%
set resultado=-%RsEntero%,%RsDecimal%
echo %resultado%
exit /b %resultado%

:multiplicar
set /a RsEntero=%entero1% %operador% %entero2%
set /a RsDecimal=%decimales1% %operador% %decimales2%
set line1=%entero1%%decimales1%
set line2=%entero2%%decimales2%
set /a RsTotal= %line1% * %line2%
set "resultado=%RsTotal:~0,-4%,%RsTotal:~-4%"
echo %resultado%
exit /b %resultado%

:dividir
set /a Dividendo=%entero1%%decimales1%
set /a Divisor=%entero2%%decimales2%
if "%Dividendo%" GTR "%Divisor%" (goto cuatro) else (set "Dividendo=%Dividendo%0" & goto tres)


:tres
for /l %%g in (%Dividendo%,-%Divisor%,0) do (
set /a cont=!cont! + 1  
if "%%g" LSS "%Divisor%" (set Resto=%%g ) )
for /l %%h in (%Resto%0,-%Divisor%,0) do (
set /a cont2=%cont2% + 1
if "%%h" LSS "%Divisor%" (set Resto=%%h0) )
for /l %%_ in (%Resto%,-%Divisor%,0) do (
set /a cont3=%cont3% + 1
if "%%_" LSS "%Divisor%" (set Resto=%%_) )
pause
set resultado=0,%cont:-=%%cont2:-=%%cont3:-=%
echo %resultado%
exit /b %resultado%

:cuatro
for /l %%i in (%Dividendo%,-%Divisor%,0) do (
set /a cont+=1
if "%%i" LSS "%Divisor%" (set Resto=%%i0 ) )
for /l %%j in (%Resto%,-%Divisor%,0) do (
set /a cont2+=1
if "%%j" LSS "%Divisor%" (set Resto=%%j0) )
for /l %%k in (%Resto%,-%Divisor%,0) do (
set /a cont3+=1
if "%%k" LSS "%Divisor%" (set Resto=%%k) )
set resultado=%cont%,%cont2%%cont3%  
echo %resultado%
exit /b %resultado%



Tambien, y derivado del float e creado otro code para realizar raices cuadradas decimales, tmb tiene error por redondeo pero menos es nada XD

Sintaxis:

sqr xx,yy


Código (dos) [Seleccionar]

@echo on
set "pam=%*"
set pam2=%2
set pam2=%pam2:~0,1%
set RefEntera=-1
set RefDecimal=-1
set cont=0
set cont2=0
set cont3=0
goto uno

:uno
set /a RefEntera= %RefEntera% + 1
set /a cont=%cont% + 1
set /a BaseEntera= %cont% * %cont%
if %BaseEntera% GTR %1 (goto dos)
if %BaseEntera% GTR %1 (goto dos)
if %BaseEntera% EQU %1%2 (echo %cont% & exit /b) else (goto uno)


:dos
pushd "%windir%\system32"
set /a RefDecimal=%RefDecimal% + 1
set /a cont3=%cont3% + 1
for /f "tokens=*" %%a in ('float.bat %RefEntera%,%cont3% * %RefEntera%,%cont3%') do (
set res=%%a)
set res=%res:,=%
set res=%res:~-6%
if %res% EQU %pam:,=% (echo %cont3%)
if %res% GTR %pam:,=% (echo %RefEntera%,%RefDecimal:~0,1%%res:~0,1% & pause & exit /b)
goto dos



Espero os resulte util o por lo menos curioso XD!!

Un saludo gente ^^
69696969 start notepad.exe ::

leogtz

No lo he probado, no he estado en Windows :s, algunas dudas sobre la división, con ¿cuantos números decimales puede trabajar?

Recomendaría que le dieras una indentación a tu código.

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Debci


LauBuru

Lo de [Com] lo puse por [Comando] intentando abreviar (haunque no fue muy acertado).

El script trabaja entre dos y cuatro decimales suele ir variando pero en las divisiones por ejemplo se podrian añadir mas decimales si volvieramos a hacer un ciclo "for /l" con el resto que quedara, en un principio lo tenia pensado para trabajar con dos decimales pero a menudo devuelve mas de dos haunque si haces la operacion con la calculadora veras que a partir del segundo decimal suele haber error por el redondeo.

Sep lo indentare para que sea mas legible XD!! perdon
69696969 start notepad.exe ::