duda, elevar una base en su exponente (batch)

Iniciado por Darioxhcx, 21 Junio 2008, 16:08 PM

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

Darioxhcx

buenas...
tengo unda duda, va algo asi , no lo puedo hacer u.u
lo que quiero hacer es elevar un numero al exponente
osea, me explico, ej..

set /p num1=escriba su base
set /p num2=escriba su exponente

ahora si x ejemplo elige como base 4 , y exponenete 4
seria facil hacerlo de esta manera
set /a resul=(%num1%*%num2%)*(%num1%*%num2%)

pero si hago esto, con cada numero
1,2,3,4,5,6,7,8,9,10 y asi
voy a hacer el code mas largo de la historia u.u
y estuve pensando y averiguando y no me sale u.u
si alguien me echa una mano
gracias

saludos

leogtz

Hola, en las librerias y funciones estaba lo que estabas buscando, un Script para calcular potencias, de ne0x
Código (dos) [Seleccionar]

:: Autor ne0x
@echo off
set /P BASE=Base :
set /P EXPONENTE=Exponente :
if %BASE%.==. exit 1
if %EXPONENTE%.==. exit 1
set resultado=1
FOR /L %%A IN (1,1,%EXPONENTE%) DO set /A resultado=resultado*BASE
echo Resultado : %resultado%
goto:EOF


Saludos.
Código (perl) [Seleccionar]

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

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

carlitos.dll

#2
El code anterior tiene un error, por ejemplo 2 elevado a -1 es 1/2, no 1.
Aquí te dejo el code que hice recién. No es confiable para números grandes, por ejemplo 800 elevado a 6. Para números pequeños sirve, auque te recomiendo la calculadora de windows, o galculator.


::CarlitoS
@echo off
setlocal enableextensions
set /a cont=2
:base
set /p base="Base:"
if "%base%" EQU "" (goto base)
set /a base=%base%
:exponente
set /p exponente="Exponente:"
if "%exponente%" EQU "" (goto exponente)
set /a exponente=%exponente%
set /a resultado=%base%

if %base% EQU 0 (if %exponente% EQU 0 (set resultado=ERROR & goto resultado))
if %exponente% GEQ 2 (call :calc & goto resultado)
if %exponente% EQU 1 (set /a resultado=%base% & goto resultado)
if %exponente% EQU 0 (set /a resultado=1 & goto resultado)
if %exponente% LSS 0 (set /a exp=%exponente% & set /a exponente=%exponente% * -1 & set expneg=true)
if "%expneg%" EQU "true" (call :calc & goto resultado)

:calc
if %exponente% EQU 1 (set /a resultado=%base% & goto :EOF)
:calc1
set /a resultado=%resultado%*%base%
set /a cont+=1
if %cont% LEQ %exponente% (goto calc1)
goto :EOF

:resultado
if "%expneg%" EQU "true" (set resultado=1/%resultado%)
if "%expneg%" EQU "true" (set /a exponente=%exp%)
if %resultado% EQU 1/1 (set /a resultado=1)
cls
echo ---------------
echo %resultado%
echo ---------------
echo %base% ^^ %exponente%
pause>NUL
::CarlitoS

Darioxhcx

gracias seguro que algo voy a sacar
primero voy a entender lso codes despues voy a probarlos xD
gracias nuevamente
saludos

carlitos.dll

En realidad no sirve para casi nada ninguno de los dos codes.

Hice una prueba: Puse en la consola:


set /a numero=9999999999


Y dice:
Número no válido. Los números están limitados a 32 bits de presición.

Entonces con números grandes, se pierde presición, por eso si colocas 10 elevado a 10, en vez de devolverte 10000000000 te devolverá 1410065408, 10 elevado a 9 lo devuelve bien. Se pierde presición al convertir a binario los números grandes, entonces el procesador multiplica por otros números, habría que hacerlo con notación científica.

Ejemplo: con 32 bits el número máximo en decimal es 2147483647 que en binario es 1111111111111111111111111111111

Si a ese número le sumas 1 te queda en decimal 2147483648 que en binario es 33 bits 10000000000000000000000000000000.

Novlucker

#5
Buenas... mi solución al problema,..... como;

1) ms-dos tiene problemas con los números grandes y los decimales, y..
2) Me gusta mucho más *.vbs (ya lo he dicho antes  :rolleyes:)
La solución es mezclar batch con vbscript... y el resultado es algo como esto...

echo off
set /p base=Base:
set /p exponente=Exponente:

echo ^set objfso = createobject("scripting.filesystemobject") >> %temp%\temp.vbs
echo ^set atemp = objfso.createtextfile(objfso.getspecialfolder(2) ^& "\calc.txt",true) >> %temp%\temp.vbs
echo resultado = %base%^^(%exponente%) >> %temp%\temp.vbs
echo atemp.writeline resultado >> %temp%\temp.vbs
echo atemp.close >> %temp%\temp.vbs
start /wait %temp%\temp.vbs

more < %temp%\calc.txt
del %temp%\calc.txt
del %temp%\temp.vbs
pause


Se que el manejar archivos en los disco raíz puede dar problemas, pero es cuestión de cambiar las rutas, la idea era mostrar una posible solución  ;D

Espero sirva como opción

Saludos  ;)

[Modifico:] He arreglado lo del disco raíz por la carpeta de temporales  ::)
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

carlitos.dll

Cita de: carlitos.dll en 21 Junio 2008, 22:12 PM
En realidad no sirve para casi nada ninguno de los dos codes.

Hice una prueba: Puse en la consola:


set /a numero=9999999999


Y dice:
Número no válido. Los números están limitados a 32 bits de presición.

Entonces con números grandes, se pierde presición, por eso si colocas 10 elevado a 10, en vez de devolverte 10000000000 te devolverá 1410065408, 10 elevado a 9 lo devuelve bien. Se pierde presición al convertir a binario los números grandes, entonces el procesador multiplica por otros números, habría que hacerlo con notación científica.

Ejemplo: con 32 bits el número máximo en decimal es 2147483647 que en binario es 1111111111111111111111111111111

Si a ese número le sumas 1 te queda en decimal 2147483648 que en binario es 33 bits 10000000000000000000000000000000.


Acabo de encontrar un libro muy bueno llamado: "Microsoft Windows Command-Line Administrator's Pocket Consultant" dónde en el capítulo 3 dice bajo el tema Using Mathematical Expressions:

Math operations are performed using set with the /A (arithmetic) parameter, such as

set /a theTotal=18+2
set /a theTotal=18*2
set /a theTotal=18/2

All mathematical expressions are evaluated using 32-bit signed integer arithmetic.

This allows for values –2 [elevado] 32 to 2 [elevado] 32–1.
If you exceed this range, you'll get an arithmetic error (code –2) instead of the intended value.



Recomiendo el libro.