I love the two lonely downvotes on this.
Programmer Humor
Welcome to Programmer Humor!
This is a place where you can post jokes, memes, humor, etc. related to programming!
For sharing awful code theres also Programming Horror.
Rules
- Keep content in english
- No advertisements
- Posts must be related to programming or programmer topics
Merging the upvotes and downvotes is the best option
nah, it's more fun this way.
It's C
Wtf? Min > Max???
Math.min isn’t the minimum integer; it’s the minimum of a list (and max visa versa)… the min/max of an undefined list is the same… IDK what it is, but this probably the most reasonable of the “WTFs” they could have put there i think… other languages would throw an exception or not compile (which JS definitely SHOULD do instead of this, buuuuut lots of JS has aversions to errors)
*edit: okay the curiosity was killing me: Math.min() is Infinity and Math.max() is -Infinity
That explains it then. It could be mislead for -inf and +inf
No, it's Javascript, keep up
Javascript is basically just C with some syntactical sugar, right? RIGHT?!?
To the contrary, it's Lisp with a lot of syntactic sugar to make it look more like C, but underneath it's nothing like C. It's a weird hybrid.
yep, because it's two different instances of an object
I always thought that NaN is required by IEEE rules to never equal any other number, including itself, because you can make NaN in different ways and this shouldn't result in equality or something, so C is wild but not javascript's fault.
The other three being true is definitely javascript's insane fault, though.
That one wasn't the one I had issues with, since the concept is essentially the same across all languages. We say it's false because we can't conclusively say that it's true. Same as the reason why null != null in SQL.
It also makes a lot of conditional expressions less complicated because comparisons of all kind against NaN return false.
I'm no expert and I know that javascript is full of wtf moments, but please.. Let it be B
It's not gong to be B, it's it.
Narrator: "It wasn't B."
It is true. Math.min() returns positive Infinity when called with no arguments and Math.max() returns Negative Infinity when called with no arguments. Positive Infinity > Negative Infinity.
Math.min() works something like this
def min(numbers):
r = Infinity
for n in numbers:
if n < r:
r = n
return r
I'm guessing there's a reason they wanted min() to be able to be called without any arguments but I'm sure it isn't a good one.
So, the language isn't compiled (or wasn't originally) so they couldn't make min()
be an error that only a developer saw, it has to be something that the runtime on the end-user system dealt with. So, it had to be assigned some value. Under those restrictions, it is the most mathematically sound value. It makes miniumum-exactly-2(x, min(<...>)) be exactly the same as min(x, <...>), even when the "<...>" has no values.
As a developer, I see a lot of value in static analysis, including refusing to generate output for sufficiently erroneous results of static analysis, so I don't like using JS, and the language that I tinker with will definitely have a separate compilation step and reject the equivalent of min()
. But, if I HAD to assign something like that a value, it probably would be a representation of infinity, if we had one (probably will due to IEEE floats).
HTH
The language not being compiled has nothing to do with error handling. You could have a min
function that operates on dynamic arrays (e.g. std::min_element in C++ or min() in Python).
Not having a separate compilation step absolutely affects error handling. With a compilation step, you can have errors that will only be seen by and must be address by a developer prior to run time. Without one, the run time system, must assign some semantics to the source code, no matter how erroneous it is.
No matter what advisory "signature" you imagine for a function, JS has to assign some run time semantics to that function being called incorrectly. Compiled languages do not have to provide a run time semantics to for signatures that can be statically checked.
I agree, compiled languages prevent large classes of errors, including invoking functions with wrong parameters. However, whether or not you define calling max() with no arguments to be an error or not is unrelated to your language being compiled or interpreted. You could define max() to be -inf in C++ if you wanted, even though the language allows you to prevent invocations of max() with no arguments altogether.
Without one, the run time system, must assign some semantics to the source code, no matter how erroneous it is.
That's just not true; as the comment above points out, Python also has no separate compilation step and yet it did not adopt this philosophy. Interpeted languages were common before JavaScript; in fact, most LISP variants are interpreted, and LISP is older than C.
Moreover, even JavaScript does sometimes throw errors, because sometimes code is simply not valid syntactically, or has no valid semantics even in a language as permissive as JavaScript.
So Eich et al. absolutely could have made more things invalid, despite the risk that end-users would see the resulting error.
Python also has no separate compilation step and yet it did not adopt this philosophy
Yes. It did. It didn't assign exactly the same semantics, but it DOES assign a run time semantic to min()
.
I'm addressing the bit that I quoted, saying that an interpreted language "must" have valid semantics for all code. I'm not specifically addressing whether or not JavaScript is right in this particular case of min()
.
...but also, what are you talking about? It throws a type error if you call min()
with no argument.
Math.min() == Infinity
Math.max() == -Infinity
Wtf is going on JS...
edit: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min
Its the min value of the input params, or Infinity.
Its the min value of the input params, or Infinity.
And the reason it's Infinity If there is no input, for better or worse, under the hood the method is assigning a variable, min, the highest value possible and then comparing it to each element in the list, reassigning it when it encounters an element lower than its value at the time. So it will obviously always be reassigned if there are any elements at all (if they're less than Infinity, I guess). But if there are no elements, it's never reassigned, and thus returns Infinity. It could have just signed min to the first element instead if Infinity, but that would lead to a runtime error when min was run without a function. If you're not going to throw a runtime error though, it makes sense for min to return Infinity because, what other number could you return that couldn't actually be the minimum
It's C, NaN is never equal to itself in floating point, that's not just a JS thing.
The one option that is mandated by an ISO standard.
Besides, if max and min are going to have a value without any parameter, it has to be exactly those Javascript uses. Unless you have a type that define other bounds for your numbers. And null always have a pointer type (that is object in Javascript), for the same reason that NaN always have a number type.
The only one that is bad on that list is D.
C, because yes.
I'd say C too because that's the only one that would be True in a normal programming language and this is javascript so...
probably not true in most other langauges. although I'm not well versed in the way numbers are represented in code and what makes a number "NaN", something tells me the technical implications of that would be quite bad in a production environment.
the definitive way to check for NaN in JS would probably be something like
// with `num` being an unknown value
// Convert value to a number
const res = Number(num);
/*
* First check if the number is 0, since 0 is a falsy
* value in JS, and if it isn't, `NaN` is the only other
* falsy number value
*/
const isNaN = res !== 0 && !res;
It's not true in a normal programming language. If it is true in yours, you should stop using it immediately.
A non type should be a type. It should be of the type none. And it is in good script languages like Python so I don't know why you think it shouldn't.