Autor
|
Tema: duda, elevar una base en su exponente (batch) (Leído 11,729 veces)
|
Darioxhcx
Desconectado
Mensajes: 2.294
|
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
|
|
|
En línea
|
|
|
|
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
Desconectado
Mensajes: 3.069
/^$/
|
Hola, en las librerias y funciones estaba lo que estabas buscando, un Script para calcular potencias, de ne0x:: Autor ne0x set /P EXPONENTE=Exponente : FOR /L %%A IN (1,1, %EXPONENTE%) DO set /A resultado=resultado*BASE echo Resultado : %resultado%
Saludos.
|
|
|
En línea
|
|
|
|
carlitos.dll
Desconectado
Mensajes: 266
|
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
|
|
« Última modificación: 21 Junio 2008, 18:59 pm por carlitos.dll »
|
En línea
|
|
|
|
Darioxhcx
Desconectado
Mensajes: 2.294
|
gracias seguro que algo voy a sacar primero voy a entender lso codes despues voy a probarlos xD gracias nuevamente saludos
|
|
|
En línea
|
|
|
|
carlitos.dll
Desconectado
Mensajes: 266
|
En realidad no sirve para casi nada ninguno de los dos codes. Hice una prueba: Puse en la consola: 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.
|
|
|
En línea
|
|
|
|
Novlucker
Ninja y
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
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 ) 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 Espero sirva como opción Saludos [Modifico:] He arreglado lo del disco raíz por la carpeta de temporales
|
|
« Última modificación: 29 Junio 2008, 04:48 am por Novlucker »
|
En línea
|
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
Desconectado
Mensajes: 266
|
En realidad no sirve para casi nada ninguno de los dos codes. Hice una prueba: Puse en la consola: 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.
|
|
|
En línea
|
|
|
|
|
|