Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript factorial prevent infinity

I have been using this function for calculating factorial numbers in JavaScript:

var f = [];
function factorial (n) {
  if (n == 0 || n == 1)
    return 1;
  if (f[n] > 0)
    return f[n];
  return f[n] = factorial(n-1) * n;
}

All seemed to be going well until I tried the number 500. It returned infinity.

Is there a way that I can prevent infinity as an answer?

Thank you.

like image 325
Progo Avatar asked Jan 14 '14 23:01

Progo


People also ask

How do you stop infinity in Javascript?

To avoid ending up in an infinite loop while using a for statement, ensure that the statements in the for() block never change the value of the loop counter variable. If they do, then your loop may either terminate prematurely or it may end up in an infinite loop.

Can you factorial infinity?

Infinity isn't a natural number, so infinity factorial isn't defined. You could ask "what's the limit of n! as n goes to infinity", which is of course infinity, and then simply define infinity factorial as infinity, but infinity isn't a number.

How do you check if a number is not infinity in Javascript?

Try it. function div(x) { if (isFinite(1000 / x)) { return 'Number is NOT Infinity. '; } return 'Number is Infinity!


1 Answers

You indeed need to use bignumbers. With math.js you can do:

// configure math.js to work with enough precision to do our calculation
math.config({precision: 2000});

// evaluate the factorial using a bignumber value
var value = math.bignumber(500);
var result = math.factorial(value);

// output the results
console.log(math.format(result, {notation: 'fixed'}));

This will output:

1220136825991110068701238785423046926253574342803192842192413588385845373153881997605496447502203281863013616477148203584163378722078177200480785205159329285477907571939330603772960859086270429174547882424912726344305670173270769461062802310452644218878789465754777149863494367781037644274033827365397471386477878495438489595537537990423241061271326984327745715546309977202781014561081188373709531016356324432987029563896628911658974769572087926928871281780070265174507768410719624390394322536422605234945850129918571501248706961568141625359056693423813008856249246891564126775654481886506593847951775360894005745238940335798476363944905313062323749066445048824665075946735862074637925184200459369692981022263971952597190945217823331756934581508552332820762820023402626907898342451712006207714640979456116127629145951237229913340169552363850942885592018727433795173014586357570828355780158735432768888680120399882384702151467605445407663535984174430480128938313896881639487469658817504506926365338175055478128640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

like image 104
Jos de Jong Avatar answered Sep 19 '22 20:09

Jos de Jong