sumador representacion punto numeros notación normalizada multiplicar flotante errores ejemplos con aritmética batch-file

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