If you try
9n**9n**9n in Chrome's console, Chrome breaks (it resembles an infinite loop).
- Does the V8 engine lack the implementation for this case?
I mean, if you try
9**9**9 it will return
Infinity, which is kind of nice.
- Why doesn't V8 return
Infinityas well in the former case?
- And why does it seem to go into an infinite loop?
I tried this in Firefox too, and this problem doesn't exist, because currently there's no BigInt implementation in SpiderMonkey.
As was said already,
9n is the BigInt representation of
** (power) operator works from right to left, causing quick escalation of results:
2n**2n**2n === 2n ** 4n === 16n 3n**3n**3n === 3n ** 27n === 7625597484987n 4n**4n**4n === 4n ** 256n === 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096n
On my system this becomes quite laggy from
7n**7n**7n, which takes about 32 seconds to
calculate print. The result is 695976 digits, the first 5000 of which are printed in the console.
I haven't tried it any further, but I'd say it is just chewing away on the result. This could well take hours or days to
calculate print (or perhaps even an Out Of Memory situation might occur at some point).
I just tried
var x = 7n**7n**7n in the Chrome console, so just assigning it to a variable, and this finished in almost no time. It turns out that converting the bigint to a string is what takes up time; printing
x.toString().length takes a similar amount of time as printing
Further experimenting revealed other interesting behaviour, see these results:
// Pure calculation time increases significantly when the exponent grows: var x = 7n**7n**7n; // ~ 1200 ms var x = 7n**8n**7n; // ~ 7000 ms var x = 7n**7n**8n; // ~ 62000 ms var x = 7n**8n**8n; // ~ 470000 ms // But it's a different story when the base number is 'simple' in binary terms, e.g. 8n: var x = 8n**7n**7n; // ~ 1 ms var x = 8n**8n**7n; // ~ 1 ms var x = 8n**7n**8n; // ~ 7 ms var x = 8n**8n**8n; // ~ 17 ms
And yes, there is an end to it all:
var x = 32n**16n**8n;
VM436:1 Uncaught RangeError: Maximum BigInt size exceeded at <anonymous>:1:28
The upper limit in Chrome appears to be 1 billion bits (1e9 bits), or about 125 MB - Reference: https://github.com/tc39/proposal-bigint/issues/174#issuecomment-437471065