Тема: CMD/BAT: Математические функции
rem Вывод числа без знака %1-Число %2-Вывод
:sint2uint
setlocal enabledelayedexpansion
set i=%1
if "!i:~0,1!"=="-" (
rem Converting Signed int to Unsigned invert sign and add 2147483648
rem Use big integer Cmd is not use Real Unsigned integer
rem 21474,83648
set /a "u=i ^ 0x80000000"
set /a "a1=((u %% 100000) + 83648) %% 100000"
set /a "r1=((u %% 100000) + 83648) / 100000"
set /a "b1=((u / 100000) %% 100000) + 21474 + r1"
set a1=00000!a1!
set i=!b1!!a1:~-5!
)
endlocal&set %2=%i%
goto :eof
rem Преобразование числа в IEEE-754 формат %1-Число %2-Деление на степень двойки %3-Вывод
:int2single
setlocal
set f=0
set s=0
if "%1"=="0" goto int2single_end
if "%1"=="" goto int2single_end
set exp=127
set mlen=%2
set n=%1
if !n! lss 0 set s=1&set /a "n=-n"
for /l %%i in (1,1,!mlen!) do (
set /a "dp=(n >> (mlen+1))"
if !dp! neq 0 set /a "n=n >> 1","exp+=1"
)
for /l %%i in (1,1,!mlen!) do (
set /a "d=(n >> mlen) & 1"
if !d!==0 set /a "n=n << 1","exp-=1"
)
set /a "f=F | (exp << 23)"
set /a "f=F | ((n & ((1 << mlen)-1)) << (23-mlen))"
set /a "f=F | (s << 31)"
:int2single_end
endlocal&set %3=%f%
goto :eof