Welcome to Doom9's Forum, THE in-place to be for everyone interested in DVD conversion. Before you start posting please read the forum rules. By posting to this forum you agree to abide by the rules.

 Doom9's Forum How to convert any integer to mod2
 Register FAQ Calendar Search Today's Posts Mark Forums Read

 22nd September 2019, 07:38 #1  |  Link TCmullet Registered User   Join Date: Nov 2003 Posts: 328 How to convert any integer to mod2 I compute an integer in a script and integer can be any value. But I need to modify it so that it is mod2 (evenly divisible by 2). How can we do that? (I've hunted but not found anything.) Will I have to write a custom function just to do that? (And I'm not sure yet whether I want to round up or down, or round closer to zero or farther--one step at a time, ha ha.) Edit: IF we have to have a function, would this do it? function MakeMod2(int myInt) { bitRshift(myInt,1) bitLshift(myInt,1) return myInt } Last edited by TCmullet; 22nd September 2019 at 07:56.
 22nd September 2019, 09:31 #2  |  Link hello_hello Registered User   Join Date: Mar 2011 Posts: 4,311 Is something like this what you need? http://avisynth.nl/index.php/Internal_functions#Floor Code: ```function MakeMod2(int myInt, int "Rounding") { # round to nearest integer = 1 # round down = 2 # round up = 3 # round towards zero = any integer other than 1, 2 or 3 rounding = default(rounding, 1) myFloat = float(myInt) Mod2Out = \ (rounding == 1) ? round(myFloat / 2.0) * 2 : \ (rounding == 2) ? floor(myFloat / 2.0) * 2 : \ (rounding == 3) ? ceil(myFloat / 2.0) * 2 : \ int(myFloat / 2.0) * 2 return Mod2Out }``` For mod4 it'd be round(myFloat / 4.0) * 4 etc. Or something similar. http://avisynth.nl/index.php/Operators I think Mod (%) works much the same way as FMod, but FMod needs float values. http://avisynth.nl/index.php/Internal_functions#Fmod Code: ```function MakeMod2(int myInt, bool "RoundUp") { RoundUp = default(RoundUp, false) Mod2Out = \ (myInt % 2 == 0) ? myInt : \ !RoundUp ? myInt - 1 : \ myInt + 1 return Mod2Out }``` Last edited by hello_hello; 22nd September 2019 at 15:26.
22nd September 2019, 10:01   #3  |  Link
StainlessS
HeartlessS Usurer

Join Date: Dec 2009
Location: Over the rainbow
Posts: 8,450
HH, 'myInt' is not defined as an optional arg to your function, but you use 'Default(myInt, 2)'.

Quote:
 Originally Posted by StainlessS Round value down to next lower multiple of factor ALWAYS (value-1)/factor*factor To round up, to the next higher multiple of factor, when value is not an exact multiple of factor. (value+factor-1)/factor*factor. To round up, to the next higher multiple of factor, ALWAYS. (value+factor)/factor*factor To round to nearest multiple of factor. (value+factor/2)/factor*factor, OR better yet, (value*2+factor)/(2*factor)*factor. (marginally less prone to intermediate result precision loss)
Where above value and factor are both type int. [above method 2 and 4 most often used, 1 and 3 rarely]

I seem to have missed out round down, [think it was already discussed, and so I missed it out]
value/factor*factor.

EDIT:
Code:
```Function RoundInt(int value, int "factor", int "roundMode") { # https://forum.doom9.org/showthread.php?p=1885480#post1885480
# Round +ve Int Value to a multiple of +ve Int Factor, using rounding mode RoundMode. Result will not go -ve.
factor = Default(factor,2)              # Default round to multiple of 2, even
roundMode=Default(roundMode,0)          # 0=Down(Default), 1=Nearest, 2=Up, 3=ALWAYS_DOWN, 4=ALWAYS_UP
Assert(0 <= value,String(value,"RoundInt: 0 <= value(%.0f) [result undefined for -ve value]"))
Assert(0  < factor,String(factor,"RoundInt: 0 < factor(%.0f)"))
Assert(0 <= RoundMode <= 4,String(RoundMode,"RoundInt: 0 <= RoundMode(%.0f) <= 4 "))
return
\   (RoundMode==0)  ?   value / factor * factor              [* Down                   *]
\ : (RoundMode==1)  ?   (value*2+factor)/(2*factor)*factor   [* Nearest : About same as (value+factor/2)/factor*factor but without intermediate result precision loss *]
\ : (RoundMode==2)  ?   (value+factor-1)/factor*factor       [* Up                     *]
\ : (RoundMode==3)  ?   (value-1)/factor*factor              [* ALWAYS_DOWN : Rare Use : Result always less than Value, except where Value=0 *]
\ :                     (value+factor)/factor*factor         [* ALWAYS_UP   : Rare Use : Result always greater than Value *]
}

FACTOR = 4  # round to multiples of 4

SSS= "Val Down Near   Up ADwn  AUp\n"
For(i=0,16) {
S=""
for(roundMode=0,4) {
r = RoundInt(i, FACTOR, roundMode)
S = S + String(r,"%5.0f")
}
SSS = SSS + String(i,"%2.0f]") + S + "\n"
}

BlankClip(Width=320,height=360)
Subtitle(SSS,Font="Courier New",lsp=0)    # Courier New = MonoSpaced font```

EDIT:
Code:
` \ : (RoundMode==1)  ?   (value*2+factor)/(2*factor)*factor   [* Nearest : About same as (value+factor/2)/factor*factor but without intermediate result precision loss *]`
where above factor/2 is eg 3/2, then we lose precision due to half of 3 being 1, instead of 1.5 [which we cannot have in type int], chosen method avoids that precision loss at that stage.
Where factor is KNOWN even [EDIT: KNOWN power of 2, including 1] (most cases) then could use the simpler method.

EDIT: Result will not go -ve for any round operation. Value Must be +ve, Factor must be 1 or greater.
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 23rd September 2019 at 10:48.

22nd September 2019, 15:01   #4  |  Link
hello_hello
Registered User

Join Date: Mar 2011
Posts: 4,311
Quote:
 Originally Posted by StainlessS HH, 'myInt' is not defined as an optional arg to your function, but you use 'Default(myInt, 2)'.
Where?

Actually I did the same for both functions initially, but for some reason I only removed it from the second one after thinking about it. I've done the same for the first one now.

Cheers.

Last edited by hello_hello; 22nd September 2019 at 15:06.

 22nd September 2019, 15:07 #5  |  Link StainlessS HeartlessS Usurer     Join Date: Dec 2009 Location: Over the rainbow Posts: 8,450 You originally had Code: `myInt = Default(myInt, 2)` I can only presume that you removed it in your previous edit after 10:01 BST [I think I copy/pasted "Default(myInt, 2)" from your post]. EDIT: Changed "between 10:01 and about 10:25 BST" to "after 10:01 BST". __________________ I sometimes post sober. StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace "Some infinities are bigger than other infinities", but how many of them are infinitely bigger ??? Last edited by StainlessS; 22nd September 2019 at 15:17.
22nd September 2019, 16:11   #6  |  Link
hello_hello
Registered User

Join Date: Mar 2011
Posts: 4,311
Quote:
 Originally Posted by StainlessS You originally had
Sorry, I thought the smiley would give away the fact I was joking (or being a smart-arse after editing the post).

 22nd September 2019, 16:25 #7  |  Link StainlessS HeartlessS Usurer     Join Date: Dec 2009 Location: Over the rainbow Posts: 8,450 Sorry, bit under the weather today, significance of smiley not recognised __________________ I sometimes post sober. StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace "Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???
 22nd September 2019, 16:53 #8  |  Link johnmeyer Registered User   Join Date: Feb 2002 Location: California Posts: 2,343 I must be missing something because this seems too easy. Don't you just: 1. Divide integer by two 2. Truncate (remove decimal) 3. Multiply by two. Example 1 (odd numbers) 13 13/2 = 6.5 Truncate = 6.0 Multiply by 2 = 12.0000 Example 1 (even numbers) 14 14/2 = 7.0 Truncate = 7.0 Multiply by 2 = 14.0000 Add one in second step if you want to round up. Last edited by johnmeyer; 23rd September 2019 at 21:04. Reason: typo
22nd September 2019, 17:18   #9  |  Link
manolito
Registered User

Join Date: Sep 2003
Location: Berlin, Germany
Posts: 2,888
I use this:
Quote:
 int = 13 mod2 = int - (int % 2) # Round Down # mod2 = int + (int % 2) # Round up
Too simple to even make a function out of it...

22nd September 2019, 17:29   #10  |  Link
StainlessS
HeartlessS Usurer

Join Date: Dec 2009
Location: Over the rainbow
Posts: 8,450
Thread title:- "How to convert any integer to mod2"

So, forget about floats, not needed.

Quote:
 Example 1 (odd numbers) 13 13/2 = 6.5 Truncate = 6.0 Multiply by 2 = 12.0000
Code:
```13
13/2 = 6 # int/int = int (truncated int, fractional part discarded)
Multiply by int 2 = 12

so 13/2*2=12```
Quote:
 Example 1 (even numbers) 14 14/2 = 7.0 Truncate = 7.0 Multiply by 14.0 # Presume "Multiply by 2 = 14.0"
Code:
`14/2*2 = 14`
Quote:
 Add one in second step if you want to round up.
(value+factor-1)/factor*factor # General round up where factor is variable

where factor=2 (modulo 2)
Round UP (13+2-1)/2*2=14 OR (13+1)/2*2=14
Round UP (14+2-1)/2*2=14 OR (14+1)/2*2=14

EDIT: NOTE, Prev post Manolito Method for Round UP only works for Modulo 2.
Code:
```integer = integer - (integer % factor)                         # Manolito method Round Down works OK

integer = integer + (factor - integer % factor)                # Modified Manolito Round Up   [EDIT: This is a BUM STEER, it dont work ]```
Above bugged
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 23rd September 2019 at 15:28.

22nd September 2019, 18:50   #11  |  Link
manolito
Registered User

Join Date: Sep 2003
Location: Berlin, Germany
Posts: 2,888
Quote:
 integer = integer + (factor - integer % factor) # Modified Manolito Round Up
For factors other than two I use this for Round Up:
Quote:
 integer = (integer + factor -1) / factor * factor
But the StainlessS version is simpler which is better...

Last edited by manolito; 22nd September 2019 at 19:25.

 22nd September 2019, 19:38 #12  |  Link MeteorRain 結城有紀   Join Date: Dec 2003 Location: NJ; OR; Shanghai Posts: 871 BitAnd(myInt, -2) maybe? and BitAnd(myInt + 1, -2) for rounding up. __________________ Projects x265 - Yuuki-Asuna-mod Download / GitHub TS - ADTS AAC Splitter | LATM AAC Splitter | BS4K-ASS Neo AviSynth+ filters - F3KDB | FFT3D | DFTTest | MiniDeen | Temporal Median
 22nd September 2019, 21:14 #13  |  Link StainlessS HeartlessS Usurer     Join Date: Dec 2009 Location: Over the rainbow Posts: 8,450 MeteorRain, Note, BitAnd() is a function, with significant lookup overhead (although not so much in avs+ compared to avs std, I think hash table was implemented in avs+), whereas ops below are done directly via the parser, and quite a bit faster [will though make little difference unless in some runtime script]. Code: ``` \ (RoundMode==0) ? value / factor * factor [* Down *] \ : (RoundMode==1) ? (value*2+factor)/(2*factor)*factor [* Nearest : About same as (value+factor/2)/factor*factor but without intermediate result precision loss *] \ : (RoundMode==2) ? (value+factor-1)/factor*factor [* Up *] \ : (RoundMode==3) ? (value-1)/factor*factor [* ALWAYS_DOWN : Rare Use *] \ : (value+factor)/factor*factor [* ALWAYS_UP : Rare Use *]``` EDIT: Also, I suggest that method that works for all values of factor is a better option, with possible exception being above Simpler Nearest when factor is power of 2(1,2,4 etc, likely most often). __________________ I sometimes post sober. StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace "Some infinities are bigger than other infinities", but how many of them are infinitely bigger ??? Last edited by StainlessS; 23rd September 2019 at 10:46.
 23rd September 2019, 07:36 #14  |  Link MeteorRain 結城有紀   Join Date: Dec 2003 Location: NJ; OR; Shanghai Posts: 871 Thanks, lesson learned. __________________ Projects x265 - Yuuki-Asuna-mod Download / GitHub TS - ADTS AAC Splitter | LATM AAC Splitter | BS4K-ASS Neo AviSynth+ filters - F3KDB | FFT3D | DFTTest | MiniDeen | Temporal Median
23rd September 2019, 15:25   #15  |  Link
StainlessS
HeartlessS Usurer

Join Date: Dec 2009
Location: Over the rainbow
Posts: 8,450
Quote:
 Originally Posted by manolito But the StainlessS version is simpler which is better...
Maybe simpler, but NOT better, sorry, was a bum steer, ie it dont work.

Code:
```FACTOR=4

SSS= ""
For(integer=0,16) {
r = integer + (factor - integer % factor)
S = String(r,"%5.0f")
SSS = SSS + String(integer,"%2.0f]") + S + "\n"
}

BlankClip(Width=320,height=360)
Subtitle(SSS,Font="Courier New",lsp=0)    # Courier New = MonoSpaced font```

Guess I shoulda checked it first before posting.

Is same as RoundInt(roundMode = 4), ALWAYS_UP. (should be same as below UP column.

EDIT:
Quote:
 Originally Posted by MeteorRain Thanks, lesson learned.
Yip, tis a lesson that many coders will need learn at some stage (me included), it is 2nd nature to presume that bit operations are fast.
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 23rd September 2019 at 15:42.

 23rd September 2019, 15:37 #16  |  Link manolito Registered User     Join Date: Sep 2003 Location: Berlin, Germany Posts: 2,888 Nice... My version came directly from Gavino, so I knew that it is correct.
23rd September 2019, 15:52   #17  |  Link
StainlessS
HeartlessS Usurer

Join Date: Dec 2009
Location: Over the rainbow
Posts: 8,450
Quote:
 Originally Posted by manolito For factors other than two I use this for Round Up: Code: `integer = (integer + factor -1) / factor * factor`
If your are talking about the above, then it is the 'standard' way to do it, and same as post #3 RoundInt(roundMode=2).

EDIT:
When factor is KNOWN 2, then, is

(integer + 2 - 1) / 2 * 2 <===> (integer + 1) / 2 * 2

(integer + 0) / 1 * 1 # Known 1, ie same as integer=integer
(integer + 1) / 2 * 2 # Known 2
(integer + 2) / 3 * 3 # Known 3
(integer + 3) / 4 * 4 # Known 4, etc
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 23rd September 2019 at 16:26.

23rd September 2019, 19:17   #18  |  Link
Gavino
Avisynth language lover

Join Date: Dec 2007
Location: Spain
Posts: 3,406
Quote:
 Originally Posted by manolito My version came directly from Gavino, so I knew that it is correct.
Thanks, Manolito!

I don't have much time for posting these days, but it's nice to see my memory lives on ...
__________________
GScript and GRunT - complex Avisynth scripting made easier

24th September 2019, 00:30   #19  |  Link
manolito
Registered User

Join Date: Sep 2003
Location: Berlin, Germany
Posts: 2,888
Quote:
 Originally Posted by Gavino I don't have much time for posting these days, but it's nice to see my memory lives on ...
Being forgotten by the AVS community should be one of your least concerns, this will not happen...

You helped me solving the above issue in 2012

And there were many other occasions when I hit a roadblock in an AVS script that your posts in different threads saved me. So I am the one who has to thank you...

24th September 2019, 01:33   #20  |  Link
johnmeyer
Registered User

Join Date: Feb 2002
Location: California
Posts: 2,343
Quote:
 Originally Posted by Gavino Thanks, Manolito! I don't have much time for posting these days, but it's nice to see my memory lives on ...
I think of you every time I type "Global" in one of my scripts and think, oh no, he would NOT approve of this.