digitalmars.D.learn - modulo Strangeness?
- Taylor Hillegeist (16/16) Jun 11 2014 I have a simpleish bit of code here that always seems to give me
- Taylor Hillegeist (4/20) Jun 11 2014 Perhaps i am stupid....
- Taylor Hillegeist (7/29) Jun 11 2014 foreach(uint x; points){
- Taylor Hillegeist (4/34) Jun 11 2014 Negative indexes are possible with modulo... that is why i am
- safety0ff (6/8) Jun 11 2014 modulo takes the sign of the dividend:
- Adam D. Ruppe (7/7) Jun 11 2014 modulo of a negative number can give some surprising results. A
I have a simpleish bit of code here that always seems to give me an error, and i can't figure out quite why. If I have a constant 43 in the modulo if breaks. however if i use points.length it seems to be ok? import std.stdio; void main(){ int points[43] = [0, 1153, 1905, 1996, 1392, 305, -888,-1773,-2041,-1600, -603, 603, 1600,2041, 1773, 888, -305,-1392,-1996,-1905,-1153, -0,1153, 1905, 1996, 1392,305, -888,-1773,-2041,-1600, -603, 603, 1600, 2041, 1773, 888, -305,-1392,-1996,-1905,-1153, 0]; foreach(int x; points){ writeln("List Value: ",points[(x%43)],"\t"); } }
Jun 11 2014
On Wednesday, 11 June 2014 at 22:32:45 UTC, Taylor Hillegeist wrote:I have a simpleish bit of code here that always seems to give me an error, and i can't figure out quite why. If I have a constant 43 in the modulo if breaks. however if i use points.length it seems to be ok? import std.stdio; void main(){ int points[43] = [0, 1153, 1905, 1996, 1392, 305, -888,-1773,-2041,-1600, -603, 603, 1600,2041, 1773, 888, -305,-1392,-1996,-1905,-1153, -0,1153, 1905, 1996, 1392,305, -888,-1773,-2041,-1600, -603, 603, 1600, 2041, 1773, 888, -305,-1392,-1996,-1905,-1153, 0]; foreach(int x; points){ writeln("List Value: ",points[(x%43)],"\t"); } }Perhaps i am stupid.... 0..points.length lol? i've been looking at this too long.
Jun 11 2014
On Wednesday, 11 June 2014 at 22:35:39 UTC, Taylor Hillegeist wrote:On Wednesday, 11 June 2014 at 22:32:45 UTC, Taylor Hillegeist wrote:foreach(uint x; points){ writeln("List Value: ",points[(x%43)],"\t"); } this must work because its a different type than an element in points[]I have a simpleish bit of code here that always seems to give me an error, and i can't figure out quite why. If I have a constant 43 in the modulo if breaks. however if i use points.length it seems to be ok? import std.stdio; void main(){ int points[43] = [0, 1153, 1905, 1996, 1392, 305, -888,-1773,-2041,-1600, -603, 603, 1600,2041, 1773, 888, -305,-1392,-1996,-1905,-1153, -0,1153, 1905, 1996, 1392,305, -888,-1773,-2041,-1600, -603, 603, 1600, 2041, 1773, 888, -305,-1392,-1996,-1905,-1153, 0]; foreach(int x; points){ writeln("List Value: ",points[(x%43)],"\t"); } }Perhaps i am stupid.... 0..points.length lol? i've been looking at this too long.
Jun 11 2014
On Wednesday, 11 June 2014 at 22:38:02 UTC, Taylor Hillegeist wrote:On Wednesday, 11 June 2014 at 22:35:39 UTC, Taylor Hillegeist wrote:Negative indexes are possible with modulo... that is why i am getting breaking... sorry all.On Wednesday, 11 June 2014 at 22:32:45 UTC, Taylor Hillegeist wrote:foreach(uint x; points){ writeln("List Value: ",points[(x%43)],"\t"); } this must work because its a different type than an element in points[]I have a simpleish bit of code here that always seems to give me an error, and i can't figure out quite why. If I have a constant 43 in the modulo if breaks. however if i use points.length it seems to be ok? import std.stdio; void main(){ int points[43] = [0, 1153, 1905, 1996, 1392, 305, -888,-1773,-2041,-1600, -603, 603, 1600,2041, 1773, 888, -305,-1392,-1996,-1905,-1153, -0,1153, 1905, 1996, 1392,305, -888,-1773,-2041,-1600, -603, 603, 1600, 2041, 1773, 888, -305,-1392,-1996,-1905,-1153, 0]; foreach(int x; points){ writeln("List Value: ",points[(x%43)],"\t"); } }Perhaps i am stupid.... 0..points.length lol? i've been looking at this too long.
Jun 11 2014
On Wednesday, 11 June 2014 at 22:32:45 UTC, Taylor Hillegeist wrote:I have a simpleish bit of code here that always seems to give me an error, and i can't figure out quite why.modulo takes the sign of the dividend: http://en.wikipedia.org/wiki/Modulo_operation#Common_pitfalls It works with length because you introduce a signed -> unsigned conversion.
Jun 11 2014
modulo of a negative number can give some surprising results. A negative index in that array would cause it to throw a range error, so my guess is that's what you're getting. If you do %array.length though it becomes an unsigned math and thus will never be negative, explaining the different result. Remember btw that when foreaching over an array, the value you get is the number in the array, not the index.
Jun 11 2014