How to initialise a variable in Javascript to INFINITE value? - javascript

How can I initialise a variable in javascript to the biggest possible number? I am looking for an equivalent of:
Integer.MAX_VALUE --> Java
INT_MAX --> C
int.MaxValue --> C#

With the new added ECMAScript feature MAX_SAFE_INTEGER
console.log(Number.MAX_SAFE_INTEGER)

var i = Number.POSITIVE_INFINITY
console.log("infinity:", i)
var max = Number.MAX_SAFE_INTEGER
console.log("max:", max)

According to the MDN documentation Number.MAX_VALUE returns the biggest number possible in Javascript smaller than infinity.
Since it is larger than the maximum safe integer (Number.MAX_SAFE_INTEGER = 2 ^ 53 - 1 vs 2 ^ 1024 for Number.MAX_VALUE), it is best represented using the BigInt object which appends n to the end of the value. i.e.:
const maxSafeValue = BigInt(Number.MAX_VALUE);
// returns 17976...n

If you want to type less:
var i = 1/0
console.log(i) // Shows 'Infinity'

Related

karatsuba multiplcation of large numbers fails in javascript

I've tried two versions of a karatsuba multiplcation algorithm and they both fail with different results when I test them with large X and Y values.
The parameters I'm using
const x = 3141592653589793238462643383279502884197169399375105820974944592
const y = 2718281828459045235360287471352662497757247093699959574966967627
const solution = 8539734222673567065463550869546574495034888535765114961879601127067743044893204848617875072216249073013374895871952806582723184
Algorithm1 I got from this page: https://gist.github.com/haocong/c2d9b2169d28eb15a94d
Expected value to equal:
8.539734222673567e+126
Received:
7.292575034127423e+22
Algorithm2 I got from this page: https://stackoverflow.com/a/28376023/604950
Expected value to equal:
8.539734222673567e+126
Received:
6.0002556749374185e+22
To reproduce you can grab this PR:
https://github.com/Falieson/Algorithms-Illuminated-Part1_TheBasics/pull/1
That is because you are using numbers that are too big and JavaScript doesn't know how to handle them.
The Number.isSafeInteger() method determines whether the provided value is a number that is a safe integer.
2^53 - 1 is a safe integer: it can be exactly represented, and no other integer rounds to it under any IEEE-754 rounding mode. In contrast, 2^53 is not a safe integer.
console.log(warn(Math.pow(2, 53)));
// expected output: "Precision may be lost!"
MDN
e.g. in your second algorithm you are doing
var res = (z2 * Math.pow(10, 2 * m ) ) + ( (z1-z2-z0) * Math.pow(10, m )) + z0;
which is not a safe operation in your case and JavaScript fails to compute it properly, giving you a wrong result.
If you put this code under the above mentioned line, you will see that.
console.log(Number.isSafeInteger(10 ** (2 * m)));
This evaluates to false.

System.OverflowException in converting js to C#

var pin = parseInt(form.mac.value.slice(-6), 16) % 10000000;
I'm convert the JS to C# like this
var pin = Convert.ToInt16(Networks[NetworkIndex, 0].Substring(Networks[NetworkIndex, 0].Length - 6)) % 10000000;
and then I get this error
An unhandled exception of type 'System.OverflowException' occurred in
mscorlib.dll Additional information: Value was either too large or too
small for an Int16.
The value is too big for Int16. Try to use Convert.ToInt32.
var pin = Convert.ToInt32(Networks[NetworkIndex, 0].Substring(Networks[NetworkIndex, 0].Length - 6)) % 10000000;
Use Convert.ToInt32 instead of Convert.ToInt16. The value is too big to fit in Int16.
The Int16 value type represents signed integers with values ranging from negative 32768 through positive 32767. 307650 is way bigger than 32767 so you should use a bigger type to store the value in. Int16 uses 2 bytes of memory to store integral value, Int32 will use 4 bytes and can manage to store a bigger range of integers. Int32 is an immutable value type that represents signed integers with values that range from negative 2,147,483,648 through positive 2,147,483,647.
Try this one
var pin = Convert.ToInt32(Networks[NetworkIndex, 0].Substring(Networks[NetworkIndex, 0].Length - 6)) % 10000000;
You can also use int.TryParse("your number", out int) This will not throw any exception(When you'll get null in string.). If it is parsed then it means the value is correct or you can explicitly throw exception from your code.
Take a look.
Int.TryParse

Javascript -- reliable to use numbers as integers? [duplicate]

This question already has answers here:
What is JavaScript's highest integer value that a number can go to without losing precision?
(21 answers)
Closed 7 years ago.
Why is it apparently safe to use numbers as integers in Javascript? What I mean is that a loop such as the one below is generally "trusted" to run the expected number of times even though the final loop requires an exact compare of (10000 == 10000) when these two values are floats and not ints. Is there some sort of built-in rounding feature that makes this safe and reliable -- or is this horrible and untrustworthy coding? Thanks.
--edit--
It is interesting that there is a declared safe integer range. I was not aware of MAX_SAFE_INTEGER. We all know the standard whine that 2 + 2 = 3.9999. I note that MAX_SAFE_INTEGER is listed as ECMAScript-6 so does this imply that IEEE-754 does not actually mention a safe integer range?
var cnt = 0;
for (var i=0 ; i<=10000 ; i++){
// loop 10001 times
cnt++;
}
alert('cnt = '+ cnt);
IEEE-754 double-precision floating point numbers (the kind used by JavaScript) have a very wide range over which they precisely represent integers, specifically -9,007,199,254,740,991 through 9,007,199,254,740,991. (Those values are being added to JavaScript's Number function as constants: MIN_SAFE_INTEGER and MAX_SAFE_INTEGER.) Outside that range, you could indeed run into trouble.
In fact, if it weren't for safety, this loop would never end:
var n, safety;
safety = 0;
for (n = 9007199254740990; n != 9007199254740999; ++n) {
if (++safety === 20) { // Long after `n` should have matched
snippet.log("Had to break out!");
break;
}
snippet.log("n = " + n);
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
Firstly, the final loop doesn't require the two values to be equal. Just that i is less than 10000.
Secondly, the Number type in JavaScript holds integer values accurately up (and down) to a point. You can access the Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER properties to see what the safe range is for your browser/engine.
And if you want to check if an instance of Number is an integer, just use the Number.isInteger() method.
var i = 10, e = document.getElementById('message');
if(Number.isInteger(i)) {
e.innerHTML = "i is an integer";
} else {
e.innerHTML = "i is not an integer";
}
<div id='message'></div>

JavaScript Max unsigned int 32?

I failed to find any constant in JS language which represents MAX UINT 32
Does it exists? I can have hardcoded the number itself, but i prefer to go in the more appropriate path of coding
For integers, Number.MAX_SAFE_INTEGER would be appropriate, as it's the maximum safe integer in JavaScript (2^53 – 1). The 53 power comes from how the double-precision floating-point numbers work. Those are also used in JavaScript to store numbers.
// In the safe integers zone:
const a = Number.MAX_SAFE_INTEGER - 1;
const b = Number.MAX_SAFE_INTEGER - 0;
console.log(a); // 9007199254740990
console.log(b); // 9007199254740991 (b + 1)
console.log(a === b); // false
// Outside the safe integers zone:
const x = Number.MAX_SAFE_INTEGER + 1;
const y = Number.MAX_SAFE_INTEGER + 2;
console.log(x); // 9007199254740992
console.log(y); // Also 9007199254740992, because precision....
console.log(x === y); // true
By the way, imagine that would happen if your iteration meets this kind of unsafe zone - infinite loop.
See also:
Number.EPSILON for the difference between 1 and the smallest floating point number greater than 1;
Number.MAX_VALUE for maximal number representable in JavaScript - not integer, but floating point.
Number.MIN_SAFE_INTEGER - for minimal safe integer (negative) in JavaScript.
Number.MIN_VALUE - for minimal negative number overall (floating point).
In some cases it's nicer to just use use Number.POSITIVE_INFINITY (or Number.NEGATIVE_INFINITY for negative), like when finding max/min values - for empty set you would get this not quite valid numerical value, that you can more easily notice and understand.
On linked pages you can also find other interesting stuff, like Number.isSafeInteger function to check whenever number is safe integer.
It does not exist, however you can have Max Numeric Value returned by Number object
You can see it here
alert(Number.MAX_VALUE);
Reference
javascript was no ints every number is a floating point number which is of class Number. The max value of that is Number.MAX_VALUE but that is almost certainly not what you are looking for (Number.MAX_VALUE = 1.7976931348623157e+308)
Try This:
<script>
function myFunction()
{
document.getElementById("demo").innerHTML=Number.MAX_VALUE;
}
</script>
Description
The MAX_VALUE property has a value of approximately 1.79E+308. Values larger than MAX_VALUE are represented as "Infinity".
Because MAX_VALUE is a static property of Number, you always use it as Number.MAX_VALUE, rather than as a property of a Number object you created.
Example: Using MAX_VALUE
The following code multiplies two numeric values. If the result is less than or equal to MAX_VALUE, the func1 function is called; otherwise, the func2 function is called.
if (num1 * num2 <= Number.MAX_VALUE) {
func1();
} else {
func2();
}

JS Minification / Closure Compiler changes numbers from base 10 to something else?

I'm running some JS through googles closure compiler and noticed something about how it handles numbers. It seems that they are converted into something other than base 10 and I can't figure out what it is.
javascript:(function(){
var x = 30000;
console.log(x);
})();
Results in:
(function(){console.log(3E4)})();
How is 3E4 == 30000?
It's callled Scientific notation, especially the "E notation" part is what you're after.
Basically, aEb === a * Math.pow(10, b) (though this would be a syntax error - a and b have to be literals, b even has to be an integer).
3 * Math.pow(10, 4) === 30000; // true
The 3 and 4 are just in base 10. This has little to do with bases in fact.
The 3e4 is the same as "saying" 3 multiplied by 4 orders of magnitude, or a 3 with 4 zeros.

Categories