batch-file - numeros - representacion con punto flotante
División de punto flotante en un dos lote (6)
Necesito hacer una división de coma flotante en un dos por lote.
No encontré la manera de hacerlo. Algo como esto :
SET /A Res=10/3
devuelve un número entero.
Es posible hacer lo ?
De acuerdo con esta referencia , no hay un tipo de coma flotante en el lenguaje de lotes de DOS:
Aunque existen variables en el lenguaje de programación por lotes de DOS, son extremadamente limitadas. No hay tipos de variable de coma flotante, puntero o entero, solo cadenas.
Creo que lo que estás tratando de hacer será imposible sin implementar tu propio esquema de división para calcular el resto explícitamente.
Escribí un archivo de lote puro específicamente para hacer división. Toma el primer número que ingresa, y luego lo divide por el segundo, y muestra el resultado con tantos puntos decimales como especifique.
Echo off
cls
if NOT "%3" == "" (
set n1=%1
set n2=%2
set max=%3
goto :begin
)
set counter=2
set n1=1
set n2=1
set ans=
:start
Echo.
Echo. 1 / 2
Echo.
Set /p N1= 1?
set /p N2= 2?
Set /p Max= Out how many Decimal Points?
:begin
set /a TmpAns=%N1%/%N2%
set ans=%TmpAns%.
:: Echo.%ans%.>Answer.txt
<nul set /p "=%Tmpans%."
set /a TmpSub=%N2%*%TmpAns%
set /a N1=%N1%-%TmpSub%
set N1=%N1%0
If NOT "%n1%" == "00" (
if %n1% LSS %N2% (
set N1=%N1%0
set ans=%ans%0
)
) else (
Goto :Finished
)
set count=0
:loop
If "%count%" == "%max%" (
Goto :Finished
)
set /a TmpAns=%N1%/%N2%
set ans=%ans%%TmpAns%
<nul set /p "=%Tmpans%"
set /a TmpSub=%N2%*%TmpAns%
set /a N1=%N1%-%TmpSub%
set N1=%N1%0
If NOT "%n1%" == "00" (
if %n1% LSS %N2% (
set N1=%N1%0
set ans=%ans%0
)
) else (
Goto :Finished
)
set /a count=%count%+1
goto :loop
:finished
cls
Echo.
Echo.
Echo.The Number
Echo.%ans%
Echo.
Echo.
set n1=1
set n2=1
pause
goto :eof
:eof
La respuesta puso en la variable% Ans%. También se puede invocar con parámetros. ("Divide.bat 50 27 5" te da 50/27 puntos decimales 5).
Hace poco encontré este archivo por lotes para calcular una aproximación de Pi. Existe una etiqueta DivideByInteger
que podría serle útil: Stupid-Coding-Tricks-A-Batch-of-Pi
Utiliza un conjunto de variables MaxQuadIndex
, cada una con un número de cuatro dígitos (cuádruple), para almacenar el resultado completo. El código permite la división por un número entero entre 1 y 10000, inclusive.
:DivideByInteger
if defined PiDebug echo.DivideByInteger %1 %2
set /a DBI_Carry = 0
for /L %%i in (!MaxQuadIndex!, -1, 0) do (
set /a DBI_Digit = DBI_Carry*10000 + %1_%%i
set /a DBI_Carry = DBI_Digit %% %2
set /a %1_%%i = DBI_Digit / %2
)
goto :EOF
Una etiqueta de Print
también está disponible ...
Los archivos por lotes como tales no admiten la aritmética de punto flotante. Sin embargo, este artículo sugiere una solución alternativa que utiliza un archivo de script externo para hacer cálculos. El archivo de script debe usar algún tipo de función eval
para evaluar la expresión pasada como argumento y devolver el resultado. Aquí hay un archivo de ejemplo de VBScript ( eval.vbs ) que hace esto:
WScript.Echo Eval(WScript.Arguments(0))
Puede invocar este script externo desde su archivo por lotes, especificar la expresión que se evaluará y obtener el resultado. Por ejemplo:
@echo off
for /f %%n in (''cscript //nologo eval.vbs "10/3"'') do (
set res=%%n
)
echo %res%
Por supuesto, obtendrá el resultado como una cadena, pero es mejor que nada de todos modos, y puede pasar el resultado obtenido al script eval como parte de otra expresión.
Sé que este es un tema muy antiguo, pero no puedo encontrar un método Batch simple en todas las respuestas anteriores, así que publico aquí una solución Batch simple que es muy simple de usar.
Realizar operaciones usando aritmética de punto fijo en Batch es simple. "Punto fijo" significa que debe establecer un número de decimales por adelantado y mantenerlo durante todas las operaciones. Las operaciones de suma y resta entre dos números de punto fijo se realizan directamente. Las operaciones de multiplicación y división requieren una variable auxiliar, que podemos llamar "uno", con el valor de 1 con el número correcto de decimales (como "0" dígitos). Después de multiplicar, divida el producto por "uno"; antes de la división, multiplica el dividendo por "uno". Aquí está:
@echo off
setlocal EnableDelayedExpansion
set decimals=2
set /A one=1, decimalsP1=decimals+1
for /L %%i in (1,1,%decimals%) do set "one=!one!0"
:getNumber
set /P "numA=Enter a number with %decimals% decimals: "
if "!numA:~-%decimalsP1%,1!" equ "." goto numOK
echo The number must have a point and %decimals% decimals
goto getNumber
:numOK
set numB=2.54
set "fpA=%numA:.=%"
set "fpB=%numB:.=%"
set /A add=fpA+fpB, sub=fpA-fpB, mul=fpA*fpB/one, div=fpA*one/fpB
echo %numA% + %numB% = !add:~0,-%decimals%!.!add:~-%decimals%!
echo %numA% - %numB% = !sub:~0,-%decimals%!.!sub:~-%decimals%!
echo %numA% * %numB% = !mul:~0,-%decimals%!.!mul:~-%decimals%!
echo %numA% / %numB% = !div:~0,-%decimals%!.!div:~-%decimals%!
Por ejemplo:
Enter a number with 2 decimals: 3.76
3.76 + 2.54 = 6.30
3.76 - 2.54 = 1.22
3.76 * 2.54 = 9.55
3.76 / 2.54 = 1.48
prueba esto
SETLOCAL EnableExtensions EnableDelayedExpansion
call :calc_ 1 (99-(100*5/100^)^)
echo !calc_v!
goto :EOF
:calc_
set scale_=1
set calc_v=
for /l %%i in (1,1,%1) do set /a scale_*=10
set /a "calc_v=!scale_!*%2"
set /a calc_v1=!calc_v!/!scale_!
set /a calc_v2=!calc_v!-!calc_v1!*!scale_!
set calc_v=!calc_v1!.!calc_v2!
goto :EOF
solo cambia
call: calc_ decimalpoint equataion
en el ejemplo
punto decimal es 1
equataion es (99- (100 * 5/100 ^) ^); asegúrese de utilizar () que inserta ^ antes) como en ^)
la respuesta es 94.0
si el punto decimal es 2
y equataion es 22/7; π pi
la respuesta es 3.14