1 (изменено: torus, 2016-05-20 15:43:35)

Тема: 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