10 ms·
You want to implement your own is-odd in your code - simple, right? isOdd = (x) => x % 2 == 1 Ut oh, your code is broken for negative numbers now since % isn't
by IncreasePosts 9d ago
You want to implement your own is-odd in your code - simple, right? isOdd = (x) => x % 2 == 1
Ut oh, your code is broken for negative numbers now since % isn't a true modulo operator...
Fine then, isOdd = (x) => x % 2 != 0
Ut oh, your code is broken because isOdd("hi") returns true now...
Fine then, isOdd = (x) => if(!isNumber(x)) throw... else return x%2 != 0
Ut oh, your code is now broken because isOdd(2^55+1) returns true now...
- rtkwe 9d agoUt oh? I've never seen that, is it variant on uh oh or something else?
- IncreasePosts 9d agoIt's something I'm fighting for in my own little way. Everyone does a glottal stop between the "uh" and "oh", so I'm trying to align the spelling Unlike the guy on him who writes all years with 5 digits like 02026, I have good reasons for my idiosyncracies.
- luplex 9d agoHm, I would not spell it with a "t" then, but maybe with an apostrophe instead. "Uh'oh" is more readable in my opinion and won't be mispronou in ced
- Dylan16807 9d ago> Ut oh, your code is now broken because isOdd(2^55+1) returns true now... I think you messed up this example. Whether I literally use "2^55" with XOR or replace it with "2*55", that version of isOdd returns false. False for isOdd(58) is obviously correct. (Also thanks C for permanently screwing up the precedence of bitwise operations because you didn't want to break some existing programs in 1972.) False for isOdd(36028797018963970) is also correct, and if you expected to send in a different number the bug is in the "+1" not the isOdd.
- IncreasePosts 9d agoSorry, it's supposed to be power. So 2**55 in JavaScript 2 to the 55th power is obviously even, so that +1 is obviously odd, but ((2*55) +1) % 2 == 0 in JavaScript.
- Dylan16807 8d agoBut there's no bug in isOdd. You're sending the number 36028797018963970 into it, which is clearly even. Putting extra code between the parentheses of the function call doesn't make it the function's responsibility. As nice as it would be for debugging if you could stuff your entire program inside of isNaN((function(){ /* your code here */ })()) and force your browser vendor to fix all problems.
- IncreasePosts 8d agoYou should check the math on a real calculator. Despite what most JavaScript implementations will tell you, 2 to the 55th power is 36028797018963968, and adding one to that value is 36028797018963969. That's clearly odd. There is no extra code between the parens. I just put them there so there wouldn't be any question as to operator precedence. I do see now that hn ate my double star, but I think you know what I mean since you told me the value that is spits out when you do the exponentiation
- Dylan16807 8d ago> There is no extra code between the parens. You have a plus and an exponentiation in there. That's code. var n = 2**55 + 1 console.log(n) isOdd(n) n is 36028797018963970. isOdd(n) is giving you the right answer. Putting the +1 inside the parentheses and talking about calculators is a sleight of hand that lets you pretend isOdd gets an odd number, but it doesn't. No odd numbers are around by the time isOdd actually does anything. The problems are in + and/or our expectations of +. It does not output 36028797018963969, and we must acknowledge that.