Honguito98
I have developed a fast floating point calculator, that can compute sums, substractions, divisions, and multiplications, all with / without decimals, but I have some problems:
1.- Some division operations, decimal point sets wrongly. (Example: .03 / .5)
2.- Doesn't strip the unnecessary zeros from end of line.
3.- Some multiplication operations, decimal point sets wrongly. (Example: 25 * 1000.05)
4.- Operations with '08' and '09' digits, have bugs. ( Example: [8.08 + .08] and [9.09 + .09] )
(This due to octal operations that recognize 'Set/a' command)
This uses AutoMacro, sets part of code as macro for use it in batch as variable, I used some parts of code from others users, making easy and fast to set a macro.
Note 1: code have several 'Rem' commands due to several tests.
Note 2: I modified a bit the code.
Code: Select all
@Echo off
Setlocal EnableExtensions
Call :Flush
Set "Game=%~0"
Set Err=-1
Set LF=^
::
Set Macros=Calc;
For %%# in (%Macros%) Do (
Call :AutoMacro %%#
)
Setlocal EnabledelayedExpansion
For %%# in (%Macros%) Do (
Set ^"%%#=!%%#:[LF]=^%LF%%LF%!"
)
Set Macros=
goto :sub
Set/p Sum1=int1:
Set/p Sum2=int2:
:Main
:: Acc = Accuracy
:: .0 = decimals .00 = cents .000 = milli
:: Test: sum -> 2 + 2.5 = 4.5
:: Set sum1=2.5
:: Set sum2=2
:: Real proccessment
:: Set sum1=2.5
:: Set sum2=2.0
:sub
for /l %%a in (1,1,100) Do (
rem calc% !random!.!Random:~0,3! + !random!.!Random:~0,3!
rem calc% 992.95 + 100.85
rem calc% 992.95 - 100.05
rem calc% 25 * 1000.05
rem calc% 1.2 / 3.5
%calc% 5.05 + .05
rem call :calc 2.2 + 2.2
rem call :calc 8.888 + 0.82000
)
::call :calc 120.523 * 2.21
::call :calc 99.5 + 100.012
pause
exit
<Function=Calc|2>
set Sum1=%1
set Mode=%2
set Sum2=%3
Set Div.acc=100
For %T in (1;2) Do (
If "!Sum%T:~0,1!" Equ "." Set "Sum%T=0!Sum%T!"
For /F "Tokens=1-2 Delims=;:,." %a in ("!Sum%T!") Do (
Set Sum%T.Int=%a
Set Sum%T.Float=%b
)
If Not Defined Sum%T.Float Set Sum%T.Float=0
For %R in (Int;Float) Do (
Set "Str=A!Sum%T.%R!"
Set/a "Len=0"
For /L %H in (4,-1,0) Do (
Set/a "Len|=1<<%H"
For %F in (!Len!) Do If "!Str:~%F,1!" Equ "" Set/a "Len&=~1<<%H"
)
Set S%T%R.Lng=!Len!
)
)
Echo;--- !Sum1.Int!.!Sum1.Float! _-_- !Sum2.Int!.!Sum2.Float!
If !S1Float.Lng! Equ !S2Float.Lng! (Set RLng=!S1Int.Lng!) Else (Set RLng=1)
Rem Floating Point Range Adjust
If !S1Float.Lng! Gtr !S2Float.Lng! (
Set/a "Cr.Lng=S1Float.Lng - S2Float.Lng"
For /L %R in (1,1,!Cr.Lng!) Do Set Sum2.Float=!Sum2.Float!0
Set/a RLng=!S1Int.Lng!
)
If !S2Float.Lng! Gtr !S1Float.Lng! (
Set/a "Cr.Lng=S2Float.Lng - S1Float.Lng"
For /L %R in (1,1,!Cr.Lng!) Do Set Sum1.Float=!Sum1.Float!0
Set/a RLng=!S2Int.Lng!
)
If !S1Int.Lng! Gtr !S2Int.Lng! Set RLng=!S1Int.Lng!
If !S2Int.Lng! Gtr !S1Int.Lng! Set RLng=!S2Int.Lng!
Echo;--- !Sum1.Int!.!Sum1.Float! _-_- !Sum2.Int!.!Sum2.Float!
Rem Octal error correction
For %T in (1;2) Do (
If "!Sum%T.Float:~0,1!" Equ "0" (
If !Sum%T.Float:~1^,1! Lss 10 If !Sum%T.Float:~1^,1! Gtr 7 (
Set Sum%T.Float=!Sum%T.Float:~1!
If Not !Sum1.Int!!Sum1.Float! Gtr 100 (
Set/a RLng-=1
)
)
)
If "!Sum%T.Int:~0,1!" Equ "0" Set Sum%T.Int=
)
Echo;--- !Sum1.Int!.!Sum1.Float! _-_- !Sum2.Int!.!Sum2.Float!
If "!Mode!" Neq "/" (
Set/a "Total=!Sum1.Int!!Sum1.Float! !mode! !Sum2.Int!!Sum2.Float!"
If Defined Sum1.Int If Defined Sum2.Int Set/a ChkInt=!Sum1.Int! !Mode! !Sum2.Int!,ChkFloat=!Sum1.Float! !Mode! !Sum2.Float!
) Else (
Set/a "Total=( !Sum1.Int!!Sum1.Float! * Div.acc ) !Mode! !Sum2.Int!!Sum2.Float!"
)
Rem Offset correction for 'minus' operations for lss than 10
If "!Mode!" Equ "-" (
If !Total! Lss 10 (
If !Sum1.Int!!Sum1.Float! Gtr !Sum2.Int!!Sum2.Float! (
Set/a RLng-=1
))
)
Rem Offset correction for '/' operations for numbers lss than 10
If "!Mode!" Equ "/" (
rem For /L %R in (2,1,!S1Int.Lng!) Do Set/a RLng-=1
REm Set/a Dv=Div.acc-1
REm If !Total! Gtr 9!Dv! Set/a RLng+=1
REm If !Total! Gtr 99!Dv! Set/a RLng+=1
REm If !Total! Gtr 999!Dv! Set/a RLng+=1
REm If !Total! Gtr 9999!Dv! Set/a RLng+=1
REm
REm If !Total! Lss !Dv! Set/a RLng-=1
REm If !Total! Lss !Dv:~1! Set/a RLng-=1
REm If !Total! Lss !Dv:~3! Set/a RLng-=1
REm If !Total! Lss !Dv:~4! Set/a RLng-=1
set/a "Rlng=!Div.Acc! / (Div.acc / 2) - 1"
)
Rem Offset corrections for '+,-,*' operations for number greater than 999
For %T in ("" 9 99 999 9999) Do (
rem If !ChkFloat! Gtr 999%~T Set/a RLng+=1
)
rem If !ChkInt! Gtr 99 Set/a RLng+=1
Rem Result
rem Echo;!Sum1.Int!!Sum1.Float! Gtr !Sum2.Int!!Sum2.Float!
For %U in (!RLng!) Do Echo;!Total:~0,%U!.!Total:~%U!
</Function=Calc>
:Flush
For /f "Tokens=1 Delims==" %%a in ('Set') Do (
If /i "%%a" Neq "Comspec" (
If /i "%%a" Neq "Tmp" (
If /i "%%a" Neq "Userprofile" (
IF /i "%%a" Neq "SystemRoot" (
Set "%%a="))))
)
Set "Path=%comspec:~0,-8%;%SystemRoot%;%Comspec:~0,-8%\Wbem"
Goto :Eof
:: -> AutoMacro helps you to set variables with functions then be ready to use <- ::
:AutoMacro
Set "Start="
set "Tm=%Tmp%\Tmp.dat"
Set "End="
Set "%~1="
For /F "Tokens=1,3 Delims=>|:" %%a in ('Findstr /N /B "</*Function=%~1" "%Game%"') Do (
If Not Defined Start (
Set Start=%%a
Set Type=%%b
) Else (
Set End=%%a
)
)
If %Type% Equ 1 (
<Nul Set/p=([LF]>>"%Tm%"
)
If %Type% Equ 2 (
<Nul Set/p=For %%` in (0;1^) Do If %%` Equ 1 (For /F "Tokens=1-9" %%1 in ("!Argv!"^) Do ([LF]>>"%Tm%"
)
Set/a Start+=2
For /F "Tokens=1* Skip=%Start% Delims=[]" %%a in ('Find /N /V "" "%Game%"') do (
If %%a Geq %End% Goto :End
<Nul Set/p=%%b[LF]>>"%Tm%"
)
:End
If %Type% Equ 1 (
<Nul Set/p=^)>>"%Tm%"
)
If %Type% Equ 2 (
<Nul Set/p=^)^) Else Set Argv=>>"%Tm%"
)
(
For /F "Delims=" %%a in ('Type "%Tm%"') Do Set "%~1=%%a"
) >Nul 2>&1 || Goto :ErrMacro
Del "%Tm%">Nul 2>&1
Set Tm=& Set Start=& Set End=
Goto :Eof
:ErrMacro
Set/a Start-=2
For %%a in (
"Macro Setup Failure from line:"
" Start: '%Start%'"
" End: '%End%'"
" Expected '%~1' macro with size less than 8KB {8010B} (8100 Letters)"
) Do Echo;%%~a
Pause>Nul
Exit
Last edited by Honguito98 (10 Mar 2014 19:49)
.::{Honguito98}::.
----------------------------
#2 18 Mar 2014 00:04
einstein1969
Hi honguito!
Very nice work.
I don't know if this help you. http.//www.dostips.com/forum/viewtopic.php?p=29201#p29201
einstein1969
----------------------------
#3 19 Mar 2014 21:51
einstein1969
Re: Problems with decimal point in my calculator program
Hi Honguito98!
I have merged my code but i don't know if is good.
This is not optimized and not tested.
Code: Select all
@Echo off
Setlocal EnableExtensions
Call :Flush
Set "Game=%~0"
Set Err=-1
Set LF=^
::
Set Macros=Calc;
For %%# in (%Macros%) Do (
Call :AutoMacro %%#
)
Setlocal EnabledelayedExpansion
For %%# in (%Macros%) Do (
Set ^"%%#=!%%#:[LF]=^%LF%%LF%!"
)
Set Macros=
goto :sub
Set/p Sum1=int1:
Set/p Sum2=int2:
:Main
:: Acc = Accuracy
:: .0 = decimals .00 = cents .000 = milli
:: Test: sum -> 2 + 2.5 = 4.5
:: Set sum1=2.5
:: Set sum2=2
:: Real proccessment
:: Set sum1=2.5
:: Set sum2=2.0
:sub
for /l %%a in (1,1,1) Do (
%calc% !random!.!Random:~0,3! + !random!.!Random:~0,3!
%calc% 992.95 + 100.85
%calc% 992.95 - 100.05
%calc% 25 * 1000.05
%calc% 1.2 / 3.5
%calc% 5.05 + .05
%calc% .03 / .5
%calc% 09 / 08
rem call :calc 2.2 + 2.2
rem call :calc 8.888 + 0.82000
)
::call :calc 120.523 * 2.21
::call :calc 99.5 + 100.012
pause
exit /b
<Function=Calc|2>
set Sum1=%1
set Mode=%2
set Sum2=%3
echo !sum1!!mode!!sum2!
Set Div.acc=100
set prec=2
For %T in (1;2) Do (
rem add initial zero if operand start with "." OK
If "!Sum%T:~0,1!" Equ "." Set "Sum%T=0!Sum%T!"
rem separe integer part and float part. OK
For /F "Tokens=1-2 Delims=;:,." %a in ("!Sum%T!") Do (
Set Sum%T.Int=%a
Set Sum%T.Float=%b
)
rem if there isn't float part set float to zero. ie there isn't ".," in operand
If Not Defined Sum%T.Float Set Sum%T.Float=0
rem temp value
rem add initial zero
for /f tokens^=1-4^ delims^=+^"^ %f in ("!Sum%T!") do set f%T=0000000000%~f%~g%~h%~i
rem add final zeros.
For %P in (!prec!) do (
set i%T=!f%T:*.=!0!f%T:~0,%P!
set i_%T=!f%T:*.=!0!f%T:~0,%P! & rem for debug
set i=!f%T:*.=!
For %I in (!i!) do if not "%I" == "!f%T!" (
set ii%T=!f%T:.%I=!!i%T:~0,1!!i%T:~1,%P! & rem for debug
set i%T=!f%T:.%I=!!i%T:~0,1!!i%T:~1,%P!
)
)
rem round + remove initial zeros
for /f "tokens=* delims=0" %z in ("!i%T!") do (
set /a "i%T=(%z+5)/10"
set /a "iii%T=(%z+5)/10" & rem for debug
)
)
rem now the operand is well written
Echo;--- !Sum1.Int!.!Sum1.Float! _-_- !Sum2.Int!.!Sum2.Float!
rem debug:
rem echo f1:!f1! f2:!f2!
rem echo i_1:!i_1! i_2:!i_2!
rem echo ii1:!ii1! ii2:!ii2!
rem echo iii1:!iii1! iii2:!iii2!
rem echo i1:!i1! i2:!i2!
rem do operations
if "!Mode!" equ "/" (set /a Total=!i1!*!Div.acc!/!i2!
) else (if "!Mode!" equ "*" (set /a Total=!i1!*!i2!/!Div.acc!) else set /a Total=!i1!!Mode!!i2!)
rem echo !Total!
set i=!Total!
For %P in (!prec!) do set nnn=!f1:~0,%P!
set mul=1!nnn!
set /a "f1=i/mul"
set /a "f2=i % mul"
set f2=!nnn!!f2!
For %P in (!prec!) do set f2=!f2:~-%P!
set Total=!f1!.!f2!
echo;!Total!
</Function=Calc>
:Flush
For /f "Tokens=1 Delims==" %%a in ('Set') Do (
If /i "%%a" Neq "Comspec" (
If /i "%%a" Neq "Tmp" (
If /i "%%a" Neq "Userprofile" (
IF /i "%%a" Neq "SystemRoot" (
Set "%%a="))))
)
Set "Path=%comspec:~0,-8%;%SystemRoot%;%Comspec:~0,-8%\Wbem"
Goto :Eof
:: -> AutoMacro helps you to set variables with functions then be ready to use <- ::
:AutoMacro
Set "Start="
set "Tm=%Tmp%\Tmp.dat"
Set "End="
Set "%~1="
For /F "Tokens=1,3 Delims=>|:" %%a in ('Findstr /N /B "</*Function=%~1" "%Game%"') Do (
If Not Defined Start (
Set Start=%%a
Set Type=%%b
) Else (
Set End=%%a
)
)
If %Type% Equ 1 (
<Nul Set/p=([LF]>>"%Tm%"
)
If %Type% Equ 2 (
<Nul Set/p=For %%` in (0;1^) Do If %%` Equ 1 (For /F "Tokens=1-9" %%1 in ("!Argv!"^) Do ([LF]>>"%Tm%"
)
Set/a Start+=2
For /F "Tokens=1* Skip=%Start% Delims=[]" %%a in ('Find /N /V "" "%Game%"') do (
If %%a Geq %End% Goto :End
<Nul Set/p=%%b[LF]>>"%Tm%"
)
:End
If %Type% Equ 1 (
<Nul Set/p=^)>>"%Tm%"
)
If %Type% Equ 2 (
<Nul Set/p=^)^) Else Set Argv=>>"%Tm%"
)
(
For /F "Delims=" %%a in ('Type "%Tm%"') Do Set "%~1=%%a"
) >Nul 2>&1 || Goto :ErrMacro
Del "%Tm%">Nul 2>&1
Set Tm=& Set Start=& Set End=
Goto :Eof
:ErrMacro
Set/a Start-=2
For %%a in (
"Macro Setup Failure from line:"
" Start: '%Start%'"
" End: '%End%'"
" Expected '%~1' macro with size less than 8KB {8010B} (8100 Letters)"
) Do Echo;%%~a
Pause>Nul
Exit
exit/B
Code: Select all
30439.291+20918.322
--- 30439.291 _-_- 20918.322
51357.61
992.95+100.85
--- 992.95 _-_- 100.85
1093.80
992.95-100.05
--- 992.95 _-_- 100.05
892.90
25*1000.05
--- 25.0 _-_- 1000.05
25001.25
1.2/3.5
--- 1.2 _-_- 3.5
0.34
5.05+.05
--- 5.05 _-_- 0.05
5.10
.03/.5
--- 0.03 _-_- 0.5
0.06
09/08
--- 09.0 _-_- 08.0
1.12
einstein1969
----------------------------
#4 22 Mar 2014 06:34
ImATootsieRollPOP
Hey Honguito98, I don't think this has to be this complicated. (Sorry if I'm not very good at what you guys are doing.)
I think you could just use this script, though I'm not sure it would work with decimals.
Code: Select all
@Echo off
set Answer=0
cls
:calc
set /p problem=Please enter the full math problem:
set /a problem=%problem%
set answer=%problem%
goto answer
:answer
cls
echo Your answer is: %answer%
echo.
pause
goto calc
Hope it helped.
Regards,
Andrew
----------------------------
#5 24 Mar 2014 07:01
Honguito98
Thanks for the feedback.
@einstein1969
Your modified code works!! But is bit slower, I think that the floating point support is very slow. But all these optimizations, I think that this calculator is faster!
@Andrew
The point for do a calculator in batch with floating point support is make some basical calculations, as well as use it tiny batch games, for example, calculate a complex coordinate or scores.
Also this is a example code for integrate a fast floating point calculator in batch, via macro.
Use variables as macros, speed up to 40-80% the execution, but set a big macro, the performance may be reduced to 10-30%
.::{Honguito98}::.
----------------------------
#6 24 Mar 2014 16:34
einstein1969
Hi Honguito,
you are right. it's slow.
My code actually deals with real numbers in the FIXED point but it is adaptable to work in near FLOAT (which is your initial approach).
But it was not clear to me how it worked. For example how you calculated the variable RLng. Why you use this variable?
However, I did some performance tests, though still does not work all the better.
But if you agree I would like to finish your idea. Which is fantastic. I like its simplicity.
I have tested the code above:
Code: Select all
set N_OPS=100
set t0=%time%
for /l %%a in (1,1,%N_OPS%) Do (
%calc% !random!.!Random:~0,3! + !random!.!Random:~0,3!
%calc% 992.95 + 100.85
%calc% 992.95 - 100.05
%calc% 25 * 1000.05
%calc% 1.2 / 3.5
%calc% 5.05 + .05
%calc% .03 / .5
%calc% 09 / 08
%calc% 8.08 + .08
%calc% 9.09 + .09
) >nul
for /F "tokens=1-8 delims=:.," %%a in ("%t0: =0%:%time: =0%") do set /a "a=(((1%%e-1%%a)*60)+1%%f-1%%b)*6000+1%%g%%h-1%%c%%d, a+=(a>>31) & 8640000, FLOPS=%N_OPS%*10000/a"
echo Elapsed:%a% centiseconds - Flops:%FLOPS:~0,-1%.%FLOPS:~-1%
Code: Select all
Elapsed:490 centiseconds - Flops:204.0
Code: Select all
<Function=Calc|2>
set Sum1=%1
set Mode=%2
set Sum2=%3
<nul set/p "=!sum1! !mode! !sum2! ="
rem precision/accurancy
set prec=2
For %P in (!prec!) do (
For %T in (1;2) Do (
for /f tokens^=1-4^ delims^=+^"^ %f in ("!Sum%T!") do set Sum%T=0000000000%~f%~g%~h%~i
set i%T=!Sum%T:*.=!0!Sum%T:~0,%P!
For %I in ("!Sum%T:*.=!") do if not "%~I" == "!Sum%T!" set i%T=!Sum%T:.%~I=!!i%T:~0,1!!i%T:~1,%P!
for /f "tokens=* delims=0" %z in ("!i%T!") do set /a "i%T=(%z+5)/10"
rem if not defined i%T set i%T=0
)
set Div.acc=1!Sum1:~0,%P!
if "!Mode!" equ "/" (
set /a Total=!i1!*!Div.acc!/!i2!
) else (
if "!Mode!" equ "*" (
set /a Total=!i1!*!i2!/!Div.acc!
) else set /a Total=!i1!!Mode!!i2!
)
set /a "Int=Total/Div.acc, Float=Total % Div.acc"
set Float=!Sum1:~0,%P!!Float!
set Float=!Float:~-%P!
)
echo; !Int!.!Float!
</Function=Calc>
Code: Select all
Elapsed:439 centiseconds - Flops:455.0
einstein1969
Last edited by einstein1969 (24 Mar 2014 18:13)
----------------------------
#7 24 Mar 2014 18:37
Honguito98
RLng variable contains a certain number for split the result from an unique result variable.
On my laptop, with 4 cores, the results are:
Without print results on screen, and don't redirect to NUL.
Code: Select all
Elapsed:102 centiseconds - Flops:627.4
Code: Select all
Elapsed:119 centiseconds - Flops:537.8
.::{Honguito98}::.
----------------------------
#8 25 Mar 2014 15:04
einstein1969
Your machine is faster than mineHonguito98 wrote:
RLng variable contains a certain number for split the result from an unique result variable.
On my laptop, with 4 cores, the results are:
Without print results on screen, and don't redirect to NUL.
Now, print result on screen and redirect to NUL (your code):Code: Select all
Elapsed:102 centiseconds - Flops:627.4
Tested with 64 and 1024 Ops, I get the same results.Code: Select all
Elapsed:119 centiseconds - Flops:537.8
I have seen your game! Fabulous! But the last do not work on my monocore old laptop
I also believe that this FP engine is more faster than using an external cscript/exe/dll. I see that often uses the dll. You could do some tests and see how many times per second loads a dll?
I also did some testing and I found two functional problems:
1) with minus operation for examples "%calc% 14797.109 - 15213.132"
i have patched this.
2) with multiply operation. examples "%calc% 3151.277 * 567.607"
i'm studing for a patch... Should be resolved in part by the Karatsuba's method.
I have changed this part of code.
Code: Select all
For /F "Delims=" %%a in ('Type "%Tm%"') Do Set "%~1=%%a"
) >Nul 2>&1 || Goto :ErrMacro
Del "%Tm%">Nul 2>&1
rem Changed: add set Type=
Set Tm=& Set Start=& Set End=&set Type=
Goto :Eof
Then the macro patched for minus operations
Code: Select all
<Function=Calc|2>
set Sum1=%1
set Mode=%2
set Sum2=%3
set prec=2
For %P in (!prec!) do (
For %T in (1;2) Do (
for /f tokens^=1-4^ delims^=+^"^ %f in ("!Sum%T!") do set Sum%T=0000000000%~f%~g%~h%~i
set i%T=!Sum%T:*.=!0!Sum%T:~0,%P!
For %I in ("!Sum%T:*.=!") do if not "%~I" == "!Sum%T!" set i%T=!Sum%T:.%~I=!!i%T:~0,1!!i%T:~1,%P!
for /f "tokens=* delims=0" %z in ("!i%T!") do set /a "i%T=(%z+5)/10"
)
set Div.acc=1!Sum1:~0,%P!
if "!Mode!" equ "/" (
set /a Total=!i1!*!Div.acc!/!i2!
) else (
if "!Mode!" equ "*" (
set /a Total=!i1!*!i2!/!Div.acc!
) else set /a Total=!i1!!Mode!!i2!
)
If !total! geq 0 (
set /a "Int=Total/Div.acc, Float=Total % Div.acc"
) else set /a "Int=Total/Div.acc, Float=-(Total % Div.acc)"
set Float=!Sum1:~0,%P!!Float!
set Float=!Float:~-%P!
)
!DBG!echo;%1 %2 %3 : !Int!.!Float!
</Function=Calc>
Code: Select all
:sub
Rem Some functional Tests:
set "DBG=" & rem debug var
%calc% 0 + 0
%calc% . + 1
%calc% . + .
%calc% 1 + 0
%calc% .03 / .5
%calc% 2.2 + 2.2
%calc% 8.888 + 0.82000
%calc% 120.523 * 2.21
%calc% 99.5 + 100.012
%calc% 14797.109 - 15213.132
%calc% 25586.17 * 13697.27
%calc% 3151.277 * 567.607
%calc% !random!.!Random:~0,3! + !random!.!Random:~0,3!
%calc% !random!.!Random:~0,3! - !random!.!Random:~0,3!
%calc% !random!.!Random:~0,3! * !random!.!Random:~0,3!
%calc% !random!.!Random:~0,3! / !random!.!Random:~0,3!
pause
Rem Performance Tests:
set "DBG=rem "
set N_CYCLES=300
set t0=!time!
for /l %%a in (1,1,!N_CYCLES!) Do (
%calc% !random!.!Random:~0,3! + !random!.!Random:~0,3!
%calc% 992.95 + 100.85
%calc% 992.95 - 100.05
%calc% 25 * 1000.05
%calc% 1.2 / 3.5
%calc% 5.05 + .05
%calc% .03 / .5
%calc% 09 / 08
%calc% 8.08 + .08
%calc% 9.09 + .09
)
for /F "tokens=1-8 delims=:.," %%a in ("%t0: =0%:%time: =0%") do set /a "a=(((1%%e-1%%a)*60)+1%%f-1%%b)*6000+1%%g%%h-1%%c%%d, a+=(a>>31) & 8640000, FLOPS=%N_CYCLES%*10*1000/a"
echo Elapsed:%a% centiseconds - Flops:%FLOPS:~0,-1%.%FLOPS:~-1%
Rem With BURST MODE
::BURST MODE ON
(setlocal & for /F "Tokens=1 delims==" %%v in ('set') do set "%%v="
set "DBG=rem "
set t0=!time!
for /l %%a in (1,1,%N_CYCLES%) Do (
%calc% !random!.!Random:~0,3! + !random!.!Random:~0,3!
%calc% 992.95 + 100.85
%calc% 992.95 - 100.05
%calc% 25 * 1000.05
%calc% 1.2 / 3.5
%calc% 5.05 + .05
%calc% .03 / .5
%calc% 09 / 08
%calc% 8.08 + .08
%calc% 9.09 + .09
)
for /F "tokens=1-8 delims=:.," %%a in ("!t0: =0!:!time: =0!") do set /a "a=(((1%%e-1%%a)*60)+1%%f-1%%b)*6000+1%%g%%h-1%%c%%d, a+=(a>>31) & 8640000, FLOPS=%N_CYCLES%*10*1000/a"
echo [BURST MODE] Elapsed:!a! centiseconds - Flops:!FLOPS:~0,-1!.!FLOPS:~-1!
endlocal)
::BURST MODE OFF
pause
exit /b
And have added a BURST MODE operation that will be good during the optimization of the performance
But now is already good.
my result:
Code: Select all
0 + 0 : 0.00
. + 1 : 1.00
. + . : 0.00
1 + 0 : 1.00
.03 / .5 : 0.06
2.2 + 2.2 : 4.40
8.888 + 0.82000 : 9.71
120.523 * 2.21 : 266.34
99.5 + 100.012 : 199.51
14797.109 - 15213.132 : -416.02
25586.17 * 13697.27 : -8652.59
3151.277 * 567.607 : 70711.12
30105.103 + 1901.152 : 32006.25
17334.123 - 17737.324 : -403.20
31474.253 * 20945.240 : -41759.86
1955.228 / 3125.317 : 0.62
Premere un tasto per continuare . . .
Elapsed:550 centiseconds - Flops:545.4
[BURST MODE] Elapsed:481 centiseconds - Flops:623.7
Premere un tasto per continuare . . .
einstein1969
Last edited by einstein1969 (25 Mar 2014 15:54)
----------------------------
#9 25 Mar 2014 16:52
Honguito98
I don't have accuracy information about how time takes to complete 'x' op's with a executable
But I know more or less how time takes:
Via cscript:
Code: Select all
For /L %%# in (1,1,100) do (
for /f "Delims=" %%a in ('cscript.exe //nologo calc.vbs') Do set Res=%%a
)
Now multiply this by 100 times: 50 * 100 = 5000 milliseconds = 5 seconds
Now, by via dll/exe (these dll files are renamed from exe file, doesn't have 'magic'), depends very much the
performance to source code:
Each init takes ~30 to 40 milliseconds
Multiply 30 by 100 is equal to 3000 milliseconds = 3 secs.
And via 'calc' function
Each init takes ~5 to 15 ms.
Multiply 5 by 300 FP op's takes 1500 ms = 1.5 secs !!!
The 'calc' function is aprox 75% more faster than cscript!
And 50% more faster than call to exe/dll program!!!
(time calculated respect to time, not Fp op's)
I think that set Type to 'nul' value isn't necessary.
My result are:
Code: Select all
Presione una tecla para continuar . . .
0 + 0 : 0.00
. + 1 : 1.00
. + . : 0.00
1 + 0 : 1.00
.03 / .5 : 0.06
2.2 + 2.2 : 4.40
8.888 + 0.82000 : 9.71
120.523 * 2.21 : 266.34
99.5 + 100.012 : 199.51
14797.109 - 15213.132 : -416.02
25586.17 * 13697.27 : -8652.59
3151.277 * 567.607 : 70711.12
4756.144 + 27841.940 : 32598.08
27182.210 - 11883.252 : 15298.96
6561.125 * 20095.163 : -8538.85
28823.283 / 9868.318 : 2.92
Presione una tecla para continuar . . .
Elapsed:461 centiseconds - Flops:650.7
[BURST MODE] Elapsed:427 centiseconds - Flops:702.5
Presione una tecla para continuar . . .
----------------------------
#10 25 Mar 2014 17:05
einstein1969
Thanks Andrew for your solution. For integer number this work very well and is very simple!ImATootsieRollPOP wrote:
Hey Honguito98, I don't think this has to be this complicated. (Sorry if I'm not very good at what you guys are doing.)
I think you could just use this script, though I'm not sure it would work with decimals.
Like I said, Sorry if that doesn't meet up with what you usually do, or doesn't support decimals. I'm still not a pro with coding like you guys do.Code: Select all
@Echo off set Answer=0 cls :calc set /p problem=Please enter the full math problem: set /a problem=%problem% set answer=%problem% goto answer :answer cls echo Your answer is: %answer% echo. pause goto calc
Hope it helped.
Regards,
Andrew
You will not believe but it might come in handy for this project that is a bit more complex.
I'll explain why:
This project transforms all real numbers to integers and for the operations of addition and subtraction performs almost the same code that you have posted.
try this:
Code: Select all
@Echo off
set Answer=0
cls
:calc
set /p problem=Please enter the full math problem:
set /a problem=%problem:.=%
set answer=%problem%
goto answer
:answer
cls
echo Your answer is: %answer:~0,-1%.%answer:~-1%
echo.
pause
goto calc
Code: Select all
3.4+5.7-2.2
einstein1969
----------------------------
#11 25 Mar 2014 23:11
einstein1969
Hi Honguito98!
Thanks for the previus information about timing!!! I appreciate.
I have implemented the karatsuba's multiply. I have not done deep testing. I have not optimized for performance.
For now will print old result and new [KARATSUBA] result for multiply operations.
The max value before are about 99,99 * 99,99.
Now work with every value from 0 to " 32768.99 " or even more.
The karatsuba for now work with precision of 2 decimal digit. The Rounding not work well, but for INPUT with precision of 2 digit the rounding isn't abilitated because work on third digit after the comma.
ie For multiply operations use yyyyyy.xx format for prec=2 or yyyyy.zzz for prec=3 (i have not tested prec=3)
This is the new code:
Code: Select all
<Function=Calc|2>
set Sum1=%1
set Mode=%2
set Sum2=%3
set prec=2
For %P in (!prec!) do (
For %T in (1;2) Do (
for /f tokens^=1-4^ delims^=+^"^ %f in ("!Sum%T!") do set Sum%T=0000000000%~f%~g%~h%~i
set i%T=!Sum%T:*.=!0!Sum%T:~0,%P!
For %I in ("!Sum%T:*.=!") do if not "%~I" == "!Sum%T!" set i%T=!Sum%T:.%~I=!!i%T:~0,1!!i%T:~1,%P!
for /f "tokens=* delims=0" %z in ("!i%T!") do set /a "i%T=(%z+5)/10"
)
set Div.acc=1!Sum1:~0,%P!
if "!Mode!" equ "/" (
set /a Total=!i1!*!Div.acc!/!i2!
) else (
if "!Mode!" equ "*" (
set /a Total=!i1!*!i2!/!Div.acc!
rem Karatsuba: work with only 2 decimal for now. Need functional test. No Round!
set /a "ac=(!i1:~0,-4!+0)*(!i2:~0,-4!+0), bd=!i1:~-4!*!i2:~-4!, KFloat=(10000/Div.acc*((!i1:~0,-4!+!i1:~-4!)*(!i2:~0,-4!+!i2:~-4!)-ac-bd)+bd/Div.acc) % Div.acc"
set /a "KInt=100000000/Div.acc/Div.acc*ac+10000/Div.acc/Div.acc*(((!i1:~0,-4!+0)+!i1:~-4!)*((!i2:~0,-4!+0)+!i2:~-4!)-ac-bd)+bd/Div.acc/Div.acc"
If !KInt! lss 0 set /a KFloat=-KFloat
set KFloat=!Sum1:~0,%P!!KFloat!
set KFloat=!KFloat:~-%P!
) else set /a Total=!i1!!Mode!!i2!
)
If !total! geq 0 (
set /a "Int=Total/Div.acc, Float=Total % Div.acc"
) else set /a "Int=Total/Div.acc, Float=-(Total % Div.acc)"
set Float=!Sum1:~0,%P!!Float!
set Float=!Float:~-%P!
)
if "!Mode!" equ "*" (!DBG!echo;%1 %2 %3 : !Int!.!Float! [KARATSUBA] : !KInt!.!KFloat!
) else !DBG!echo;%1 %2 %3 : !Int!.!Float!
</Function=Calc>
Code: Select all
:sub
Rem Some functional Tests:
set "DBG=" & rem debug var
%calc% 0 + 0
%calc% . + 1
%calc% . + .
%calc% 1 + 0
%calc% .03 / .5
%calc% 2.2 + 2.2
%calc% 8.888 + 0.82000
%calc% 120.52 * 2.21
%calc% 99.5 + 100.012
%calc% 14797.109 - 15213.132
%calc% 25586.17 * 13697.27
%calc% 3151.27 * 567.60
%calc% !random!.!Random:~0,3! + !random!.!Random:~0,3!
%calc% !random!.!Random:~0,3! - !random!.!Random:~0,3!
%calc% !random!.!Random:~0,2! * !random!.!Random:~0,2!
%calc% !random!.!Random:~0,3! / !random!.!Random:~0,3!
%calc% 999.99 * 999.99
%calc% 13 * 14.00
%calc% 32768.99 * 32768.99
pause
Code: Select all
0 + 0 : 0.00
. + 1 : 1.00
. + . : 0.00
1 + 0 : 1.00
.03 / .5 : 0.06
2.2 + 2.2 : 4.40
8.888 + 0.82000 : 9.71
120.52 * 2.21 : 266.34 [KARATSUBA] : 266.34
99.5 + 100.012 : 199.51
14797.109 - 15213.132 : -416.02
25586.17 * 13697.27 : -8652.59 [KARATSUBA] : 350460678.75
3151.27 * 567.60 : 70673.93 [KARATSUBA] : 1788660.85
220.160 + 18710.258 : 18930.42
2641.267 - 30378.233 : -27736.96
9659.13 * 1303.75 : 137685.57 [KARATSUBA] : 12581306.59
29125.317 / 27256.223 : 1.06
999.99 * 999.99 : 140986.54 [KARATSUBA] : 999980.00
13 * 14.00 : 182.00 [KARATSUBA] : 182.00
32768.99 * 32768.99 : 64881.62 [KARATSUBA] : 1073806705.62
Premere un tasto per continuare . . .
Elapsed:711 centiseconds - Flops:421.9
[BURST MODE] Elapsed:612 centiseconds - Flops:490.1
Premere un tasto per continuare . . .
Also, we should try as deal with negative numbers.
EDIT: I have posted a parzial code. I have correct!
einstein1969
Last edited by einstein1969 (26 Mar 2014 00:08)
----------------------------
#12 27 Mar 2014 16:52
Honguito98
Well, speeds seems slowdowns, but now we can multiply numbers with more than 32-bit of precission!.
I think that this slowdonw is only caused when is multiplied a number greater than... for example: 999.99 by 999.99
Edit: for get more speed, why not add an conditional, if !i1! geq 99999 if !i2! gtr 21399 do the Karatsuba algorithm.
Edit 2: fails the multilpication: %calc% 999.99 * 200.99, fails on Karatsuba algorithm:
Code: Select all
0 + 0 : 0.00
Número no válido . Las constantes numéricas son decimales(17),
hexadecimales (0x11), u octales (021).
Número no válido . Las constantes numéricas son decimales(17),
hexadecimales (0x11), u octales (021).
999.99 * 200.99 : 200987.99 [KARATSUBA] : .00
. + 1 : 1.00
. + . : 0.00
1 + 0 : 1.00
.03 / .5 : 0.06
2.2 + 2.2 : 4.40
8.888 + 0.82000 : 9.71
120.52 * 2.21 : 266.34 [KARATSUBA] : 266.34
99.5 + 100.012 : 199.51
14797.109 - 15213.132 : -416.02
25586.17 * 13697.27 : -8652.59 [KARATSUBA] : 350460678.75
3151.27 * 567.60 : 70673.93 [KARATSUBA] : 1788660.85
16333.138 + 31913.204 : 48246.34
14095.876 - 29912.806 : -15816.93
23410.19 * 20989.18 : 16433.08 [KARATSUBA] : 491360691.74
24979.316 / 11447.165 : 2.18
999.99 * 999.99 : 140986.54 [KARATSUBA] : 999980.00
13 * 14.00 : 182.00 [KARATSUBA] : 182.00
32768.99 * 32768.99 : 64881.62 [KARATSUBA] : 1073806705.62
Presione una tecla para continuar . . .
Code: Select all
0 + 0 : 0.00
. + 1 : 1.00
. + . : 0.00
1 + 0 : 1.00
.03 / .5 : 0.06
2.2 + 2.2 : 4.40
8.888 + 0.82000 : 9.71
120.52 * 2.21 : 266.34 [KARATSUBA] : 266.34
99.5 + 100.012 : 199.51
14797.109 - 15213.132 : -416.02
25586.17 * 13697.27 : -8652.59 [KARATSUBA] : 350460678.75
3151.27 * 567.60 : 70673.93 [KARATSUBA] : 1788660.85
12417.438 + 10276.439 : 22693.88
456.192 - 867.116 : -410.93
17885.17 * 1720.31 : -155727.72 [KARATSUBA] : 30768036.80
22547.172 / 10661.313 : 2.11
999.99 * 999.99 : 140986.54 [KARATSUBA] : 999980.00
13 * 14.00 : 182.00 [KARATSUBA] : 182.00
32768.99 * 32768.99 : 64881.62 [KARATSUBA] : 1073806705.62
Presione una tecla para continuar . . .
Elapsed:614 centiseconds - Flops:488.5
[BURST MODE] Elapsed:559 centiseconds - Flops:536.6
Presione una tecla para continuar . . .
.::{Honguito98}::.
----------------------------
#13 28 Mar 2014 03:12
einstein1969
Hi Honguito98!
I have done some test with IF but the speed do not change!
I have tested with your condition and with this always false condition:
Code: Select all
If 1==0 (
karatsuba
...
)
Seem that the lenght of the macro (number of char and not operation done) slowdown . Even in Burstmode!
I think that there is some work to do on the mechanism of the macro. But i don't know how this work.
But .... I have found a solution for the moment. The speed is little better of last.
I have create another macro. I have nominate KAR (Calc.kar or Calc_kar seem do not work). I prefer Math.calc; Math.Kar; Math.xxx; etc. It is possible?
I have patched the last problem of karatsuba.
The new macros:
Code: Select all
<Function=Calc|2>
set Sum1=%1
set Mode=%2
set Sum2=%3
set prec=2
For %P in (!prec!) do (
For %T in (1;2) Do (
for /f tokens^=1-4^ delims^=+^"^ %f in ("!Sum%T!") do set Sum%T=0000000000%~f%~g%~h%~i
set i%T=!Sum%T:*.=!0!Sum%T:~0,%P!
For %I in ("!Sum%T:*.=!") do if not "%~I" == "!Sum%T!" set i%T=!Sum%T:.%~I=!!i%T:~0,1!!i%T:~1,%P!
for /f "tokens=* delims=0" %z in ("!i%T!") do set /a "i%T=(%z+5)/10"
)
set Div.acc=1!Sum1:~0,%P!
if "!Mode!" equ "/" (
set /a Total=!i1!*!Div.acc!/!i2!
) else (
if "!Mode!" equ "*" (
set /a Total=!i1!*!i2!/!Div.acc!
) else set /a Total=!i1!!Mode!!i2!
)
If !total! geq 0 (
set /a "Int=Total/Div.acc, Float=Total % Div.acc"
) else set /a "Int=Total/Div.acc, Float=-(Total % Div.acc)"
set Float=!Sum1:~0,%P!!Float!
set Float=!Float:~-%P!
)
!DBG!echo;%1 %2 %3 : !Int!.!Float!
</Function=Calc>
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::
:: P=precision , number of digit after decimal point
:: DA=Div.acc , contain a number that is 100 for prec=2 ora 1000 for prec=3 etc.
:: ex division accurancy.
::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
<Function=Kar|2>
set Sum1=%1
set Mode=%2
set Sum2=%3
set P=2
For %P in (!P!) do (
For %T in (1;2) Do (
for /f tokens^=1-4^ delims^=+^"^ %f in ("!Sum%T!") do set Sum%T=0000000000%~f%~g%~h%~i
set i%T=!Sum%T:*.=!0!Sum%T:~0,%P!
For %I in ("!Sum%T:*.=!") do if not "%~I" == "!Sum%T!" set i%T=!Sum%T:.%~I=!!i%T:~0,1!!i%T:~1,%P!
for /f "tokens=* delims=0" %z in ("!i%T!") do set /a "i%T=(%z+5)/10"
)
set DA=1!Sum1:~0,%P!
set /a "a=(!i1:~0,-4!+0), b=1!i1:~-4!-(11!i1:~-4!-1!i1:~-4!)/10, c=(!i2:~0,-4!+0), d=1!i2:~-4!-(11!i2:~-4!-1!i2:~-4!)/10, KFloat=(10000/DA*((a+b)*(c+d)-a*c-b*d)+b*d/DA) % DA, KInt=100000000/DA/DA*a*c+10000/DA/DA*((a+b)*(c+d)-a*c-b*d)+b*d/DA/DA"
If !KInt! lss 0 set /a KFloat=-KFloat
set KFloat=!Sum1:~0,%P!!KFloat!
set KFloat=!KFloat:~-%P!
)
!DBG!echo;%1 %2 %3 : !KInt!.!KFloat! [KAR.]
</Function=Kar>
Code: Select all
Set Macros=Calc;Kar;
then i have added some functional test on karatsuba and a performance test on only karatsuba
This is the code changed from label :sub
Code: Select all
:sub
Rem Some functional Tests:
set "DBG=" & rem debug var
%calc% 999.99 * 200.99
%kar% 999.99 * 200.99
%calc% 0 + 0
%calc% . + 1
%calc% . + .
%calc% 1 + 0
%calc% .03 / .5
%calc% 2.2 + 2.2
%calc% 8.888 + 0.82000
%calc% 120.52 * 2.21
%kar% 120.52 * 2.21
%calc% 99.5 + 100.012
%calc% 14797.109 - 15213.132
%calc% 25586.17 * 13697.27
%kar% 25586.17 * 13697.27
%calc% 3151.27 * 567.60
%kar% 3151.27 * 567.60
%calc% !random!.!Random:~0,3! + !random!.!Random:~0,3!
%calc% !random!.!Random:~0,3! - !random!.!Random:~0,3!
%calc% !random!.!Random:~0,2! * !random!.!Random:~0,2!
%kar% !random!.!Random:~0,2! * !random!.!Random:~0,2!
%calc% !random!.!Random:~0,3! / !random!.!Random:~0,3!
%calc% 999.99 * 999.99
%kar% 999.99 * 999.99
%calc% 13 * 14.00
%kar% 13 * 14.00
%calc% 32768.99 * 32768.99
%kar% 32768.99 * 32768.99
%kar% !random!.!Random:~0,2! * !random!.!Random:~0,2!
%kar% 992.95 * 100.85
%kar% 992.95 * 100.05
%kar% 25 * 1000.05
%kar% 16789.2 * 3.5
%kar% 5.05 * .05
%kar% .03 * .5
%kar% 09 * 08080
%kar% 8.08 * .08
%kar% 9.09 * .09
pause
Rem Performance Tests:
set "DBG=rem "
set N_CYCLES=300
set t0=!time!
for /l %%a in (1,1,!N_CYCLES!) Do (
%calc% !random!.!Random:~0,3! + !random!.!Random:~0,3!
%calc% 992.95 + 100.85
%calc% 992.95 - 100.05
%kar% 25 * 1000.05
%calc% 1.2 / 3.5
%calc% 5.05 + .05
%calc% .03 / .5
%calc% 09 / 08
%calc% 8.08 + .08
%calc% 9.09 + .09
)
for /F "tokens=1-8 delims=:.," %%a in ("%t0: =0%:%time: =0%") do set /a "a=(((1%%e-1%%a)*60)+1%%f-1%%b)*6000+1%%g%%h-1%%c%%d, a+=(a>>31) & 8640000, FLOPS=%N_CYCLES%*10*1000/a"
echo Elapsed:%a% centiseconds - Flops:%FLOPS:~0,-1%.%FLOPS:~-1%
Rem Test Karatsuba only
set t0=!time!
for /l %%a in (1,1,!N_CYCLES!) Do (
%kar% !random!.!Random:~0,2! * !random!.!Random:~0,2!
%kar% 992.95 * 100.85
%kar% 992.95 * 100.05
%kar% 25 * 1000.05
%kar% 16789.2 * 3.5
%kar% 5.05 * .05
%kar% .03 * .5
%kar% 09 * 08080
%kar% 8.08 * .08
%kar% 9.09 * .09
)
for /F "tokens=1-8 delims=:.," %%a in ("%t0: =0%:%time: =0%") do set /a "a=(((1%%e-1%%a)*60)+1%%f-1%%b)*6000+1%%g%%h-1%%c%%d, a+=(a>>31) & 8640000, FLOPS=%N_CYCLES%*10*1000/a"
echo Elapsed:%a% centiseconds - Flops:%FLOPS:~0,-1%.%FLOPS:~-1% [KAR.]
Rem With BURST MODE
::BURST MODE ON
(setlocal & for /F "Tokens=1 delims==" %%v in ('set') do set "%%v="
set "DBG=rem "
set t0=!time!
for /l %%a in (1,1,%N_CYCLES%) Do (
%calc% !random!.!Random:~0,3! + !random!.!Random:~0,3!
%calc% 992.95 + 100.85
%calc% 992.95 - 100.05
%kar% 25 * 1000.05
%calc% 1.2 / 3.5
%calc% 5.05 + .05
%calc% .03 / .5
%calc% 09 / 08
%calc% 8.08 + .08
%calc% 9.09 + .09
)
rem set
for /F "tokens=1-8 delims=:.," %%a in ("!t0: =0!:!time: =0!") do set /a "a=(((1%%e-1%%a)*60)+1%%f-1%%b)*6000+1%%g%%h-1%%c%%d, a+=(a>>31) & 8640000, FLOPS=%N_CYCLES%*10*1000/a"
echo Elapsed:!a! centiseconds - Flops:!FLOPS:~0,-1!.!FLOPS:~-1! [BURST MODE]
endlocal)
::BURST MODE OFF
Code: Select all
999.99 * 200.99 : 200987.99
999.99 * 200.99 : 200987.99 [KAR.]
0 + 0 : 0.00
. + 1 : 1.00
. + . : 0.00
1 + 0 : 1.00
.03 / .5 : 0.06
2.2 + 2.2 : 4.40
8.888 + 0.82000 : 9.71
120.52 * 2.21 : 266.34
120.52 * 2.21 : 266.34 [KAR.]
99.5 + 100.012 : 199.51
14797.109 - 15213.132 : -416.02
25586.17 * 13697.27 : -8652.59
25586.17 * 13697.27 : 350460678.75 [KAR.]
3151.27 * 567.60 : 70673.93
3151.27 * 567.60 : 1788660.85 [KAR.]
12082.185 + 20749.282 : 32831.47
5305.318 - 29429.236 : -24123.92
4201.14 * 27637.19 : 143587.40
30885.71 * 18469.12 : 570431884.27 [KAR.]
20964.478 / 1099.912 : 19.06
999.99 * 999.99 : 140986.54
999.99 * 999.99 : 999980.00 [KAR.]
13 * 14.00 : 182.00
13 * 14.00 : 182.00 [KAR.]
32768.99 * 32768.99 : 64881.62
32768.99 * 32768.99 : 1073806705.62 [KAR.]
30898.29 * 10235.16 : 316248941.87 [KAR.]
992.95 * 100.85 : 100139.00 [KAR.]
992.95 * 100.05 : 99344.64 [KAR.]
25 * 1000.05 : 25001.25 [KAR.]
16789.2 * 3.5 : 58762.20 [KAR.]
5.05 * .05 : 0.25 [KAR.]
.03 * .5 : 0.01 [KAR.]
09 * 08080 : 72720.00 [KAR.]
8.08 * .08 : 0.64 [KAR.]
9.09 * .09 : 0.81 [KAR.]
Premere un tasto per continuare . . .
Elapsed:603 centiseconds - Flops:497.5
Elapsed:572 centiseconds - Flops:524.4 [KAR.]
Elapsed:486 centiseconds - Flops:617.2 [BURST MODE]
The Burstmode speed is high!
I'll let you surprise ...
Guess what is it?
Code: Select all
@echo off
set /a "x=4000, g0=2*10+1, z0=g0=(g0+x/g0)/2, z1=g0=g0*(g0*g0+3*x)/((3*g0*g0+x)), g0=g0*(g0*g0+3*x)/((3*g0*g0+x)), g1=g0*(g0*g0+3*x*1)*100/((3*g0*g0+x*1))"
echo %g1%
einstein1969
Last edited by einstein1969 (28 Mar 2014 03:22)
----------------------------
#14 28 Mar 2014 17:11
Honguito98
AutoMacro: I think that these names of variables or functions that includes fails with FindStr, which this be 'confused' and the dot is taken as wildcard.
The calc is more speedy!
My tests are:
Code: Select all
Presione una tecla para continuar . . .
999.99 * 200.99 : 200987.99
999.99 * 200.99 : 200987.99 [KAR.]
0 + 0 : 0.00
. + 1 : 1.00
. + . : 0.00
1 + 0 : 1.00
.03 / .5 : 0.06
2.2 + 2.2 : 4.40
8.888 + 0.82000 : 9.71
120.52 * 2.21 : 266.34
120.52 * 2.21 : 266.34 [KAR.]
99.5 + 100.012 : 199.51
14797.109 - 15213.132 : -416.02
25586.17 * 13697.27 : -8652.59
25586.17 * 13697.27 : 350460678.75 [KAR.]
3151.27 * 567.60 : 70673.93
3151.27 * 567.60 : 1788660.85 [KAR.]
6375.137 + 20219.117 : 26594.26
25202.240 - 8435.614 : 16766.63
15818.16 * 25288.28 : 152603.90
25832.76 * 9045.70 : 233675397.13 [KAR.]
2962.684 / 21445.107 : 0.13
999.99 * 999.99 : 140986.54
999.99 * 999.99 : 999980.00 [KAR.]
13 * 14.00 : 182.00
13 * 14.00 : 182.00 [KAR.]
32768.99 * 32768.99 : 64881.62
32768.99 * 32768.99 : 1073806705.62 [KAR.]
17527.31 * 30028.28 : 526314972.32 [KAR.]
992.95 * 100.85 : 100139.00 [KAR.]
992.95 * 100.05 : 99344.64 [KAR.]
25 * 1000.05 : 25001.25 [KAR.]
16789.2 * 3.5 : 58762.20 [KAR.]
5.05 * .05 : 0.25 [KAR.]
.03 * .5 : 0.01 [KAR.]
09 * 08080 : 72720.00 [KAR.]
8.08 * .08 : 0.64 [KAR.]
9.09 * .09 : 0.81 [KAR.]
Presione una tecla para continuar . . .
Elapsed:477 centiseconds - Flops:628.9
Elapsed:442 centiseconds - Flops:678.7 [KAR.]
Elapsed:425 centiseconds - Flops:705.8 [BURST MODE]
Presione una tecla para continuar . . .
And the last code: I don't know, I bad for maths, I think that is an algorithm for get a result of something, like get the cosine of x number.
.::{Honguito98}::.
----------------------------
#15 31 Mar 2014 20:56
einstein1969
Hi Honguito!
I have reading your algos and i see that is very good. It separates the int and float parts and might be more accurate than previous.
I'm arrived at this part and is not clear how RLNG is calculated. The conditions that choose the contents are a bit confusing for me.
Code: Select all
If !S1Float.Lng! Equ !S2Float.Lng! (Set RLng=!S1Int.Lng!) Else (Set RLng=1)
Rem Floating Point Range Adjust
If !S1Float.Lng! Gtr !S2Float.Lng! (
Set/a "Cr.Lng=S1Float.Lng - S2Float.Lng"
For /L %R in (1,1,!Cr.Lng!) Do Set Sum2.Float=!Sum2.Float!0
Set/a RLng=!S1Int.Lng!
)
If !S2Float.Lng! Gtr !S1Float.Lng! (
Set/a "Cr.Lng=S2Float.Lng - S1Float.Lng"
For /L %R in (1,1,!Cr.Lng!) Do Set Sum1.Float=!Sum1.Float!0
Set/a RLng=!S2Int.Lng!
)
If !S1Int.Lng! Gtr !S2Int.Lng! Set RLng=!S1Int.Lng!
If !S2Int.Lng! Gtr !S1Int.Lng! Set RLng=!S2Int.Lng!
Ps. the previous code is not sin(x) or cos(x) but SQRT(x). I have worked for sin and cos. You can found in this thread.
Code: Select all
Sqrt(40.00) = 6.324 :
set /a "x=4000, g0=2*10+1, z0=g0=(g0+x/g0)/2, z1=g0=g0*(g0*g0+3*x)/((3*g0*g0+x)), g0=g0*(g0*g0+3*x)/((3*g0*g0+x)), g1=g0*(g0*g0+3*x*1)*100/((3*g0*g0+x*1))"
6324
Last edited by einstein1969 (31 Mar 2014 21:32)
----------------------------
#16 31 Mar 2014 22:01
einstein1969
Hi Honguito98,
for sin and cos this code is very fast alternative if you want get a circle/elliptical and square path:
A demo that work with no accelerators:
Code: Select all
@echo off&setlocal EnableDelayedExpansion
set /a cols=140, lines=54
cls
pushd "%temp%"
for /f %%a in ('"prompt $H&for %%b in (1) do rem"') do set "BS=%%a"
For /L %%c in (1,1,%cols%) do set "str_findstr=!str_findstr!L"
For /L %%l in (1,1,%cols%) do <nul set /p .=%BS%> "!str_findstr:~0,%%l!"
set Col=123456789abcdef
rem this parameter control the eccentrip and rotational speed. Use 2^x=2, 4 ,8 etc
set /a "e=10000/4" & rem 1.0000/4
rem start point
set /a y=20, x=40
rem center point
set /a offsetx=70, offsety=25
for /L %%i in (1,1,10000) do (
mode %cols%,%lines%
set /a "x=x-e*y/10000, y=y+e*x/10000, cx=x+offsetx, cy=y/2+offsety, e=10000/(4+%%i/100), color=(x^y) %% 15"
For /L %%y in (1,1,!cy!) do echo(
<nul set /p "=%BS% "
for %%N in (!cx!) do for %%c in (!color!) do call :ColorText_bg_BS !col:~%%c,1! %%N
)
popd
goto :eof
:ColorText_bg_BS bg_color len [/n]
(
set /a "len=%2-1"
if %1 equ 0 (set fg=1) else set fg=%1
if !len! geq 1 for %%. in (!len!) do findstr /v /a:%1!fg! /R "^$" "!str_findstr:~0,%%.!" nul
if /i "%~3"=="/n" echo(
goto :eof
)
EDIT: This show the x path better:
@echo off&setlocal EnableDelayedExpansion
set /a cols=150, lines=60
cls
mode %cols%,%lines%
pushd "%temp%"
for /f %%a in ('"prompt $H&for %%b in (1) do rem"') do set "BS=%%a"
For /L %%c in (1,1,%cols%) do set "str_findstr=!str_findstr!L"
For /L %%l in (1,1,%cols%) do <nul set /p .=%BS%> "!str_findstr:~0,%%l!"
set Col=123456789abcdef
rem this parameter control the eccentrip and rotational speed. Use 2^x=2, 4 ,8 etc
set /a ecc=2
rem start point
set /a y=20, x=40
rem center point
set /a offsetx=70, offsety=25
for /L %%i in (1,1,10000) do (
if %%i gtr !step! (set /a "color=(color+1) %% 15, step+=200" & for %%c in (!color!) do color !col:~%%c,1!0 )
set /a "x=x-e*y/10000, y=y+e*x/10000, cx=x+offsetx, cy=y/2+offsety, e=10000/(ecc+%%i/100)"
echo(
for %%x in (!cx!) do findstr /v /a:10 /R "^$" "!str_findstr:~0,%%x!" nul
)
)
popd
goto :eof
Last edited by einstein1969 (01 Apr 2014 01:35)
original thread: oldforum/viewtopic.php?id=1838