Why can't Matlab do the factorial of a non-integer number?

8 views (last 30 days)
Hi,
I tried using the factorial function on a number with decimals and got the following error: N must be an array of real non-negative integers.
Is there an alternative so that it can calculate the factorial of a number with decimals like Excel does?
Thanks for your time

Accepted Answer

Davide Masiello
Davide Masiello on 6 Feb 2022
Edited: Davide Masiello on 6 Feb 2022
MatLab 'factorial' is coded so to work with integers only.
The generalization of a factorial is the Γ function, which is
and the relation with the factorial is
MatLab implements the Γ function. Therefore, to compute the factorial of 1.5 you can write
gamma(2.5)
Which yields 1.3293, the correct answer.
  3 Comments
Dyuman Joshi
Dyuman Joshi on 23 Jan 2024
There is no function in MATLAB, in-built or a part of the toolbox, that offers that functionality directly.
(Possibly because) There is no known explicit relation or definition which can be utilized to obtain that.
However, you can try this -
%value of which the inverse is to be calculated
y = gamma(2.5)
y = 1.3293
f = @(x, val) gamma(x) - val;
out = fzero(@(x) f(x, y), 2)
out = 2.5000
But note that the inverse gamma function is not one-on-one (reference - Graph of the function provided in its wikipedia article - https://en.wikipedia.org/wiki/Inverse_gamma_function), so multiple solutions exist for each input.
The value obtained as the output depends on the initial guess -
%Finding the inverse for the same, but with initial guess as 1
fzero(@(x) f(x, y), 1)
ans = 0.6809
John D'Errico
John D'Errico on 2 Dec 2024
Far too late to answer @Andy, but I need to point this out.
gaminv is NOT the inverse of the gamma function. gaminv is the inverse of the gamma CDF. It is provided with the stats toolbox. It does not compute the inverse of the gamma function. Yes, it may be a bit confusing due to the name.
As well, gammaincinv is not the tool you want either. That evaluates the inverse of the INCOMPLETE gamma integral. Again, not what you want. A different animal.
I'm sorry, but it seems to be not a terribly common need to compute the inverse of the complete gamma function, so effectively the inverse of the extension of the factorial function into the real line. It is not something I've ever had a need to do in practice, nor have I seen requests for it.
You can use fzero, as shown by @Dyuman Joshi.

Sign in to comment.

More Answers (4)

David Hill
David Hill on 6 Feb 2022
Use the gamma function.
gamma(1.3);

DGM
DGM on 6 Feb 2022
See the Gamma function
Or in MATLAB, gamma().
Note that if you're trying to replicate the behavior of factorial, the input is offset by 1:
factorial([2 3 4])
ans = 1×3
2 6 24
gamma([2 2.5 3 3.2 3.6 4])
ans = 1×6
1.0000 1.3293 2.0000 2.4240 3.7170 6.0000
gamma([2 2.5 3 3.2 3.6 4]+1) % offset by 1
ans = 1×6
2.0000 3.3234 6.0000 7.7567 13.3813 24.0000

Fryderyk Kukowski
Fryderyk Kukowski on 2 Dec 2024
As other answers have provided the explanation of the problem but no ready implementation, I'll fill in this gap.
Here (and the same is in the attachment) is the function that will do just what you want.
function y = realFactorial(x)
y = gamma(x + 1);
end
  5 Comments
Fryderyk Kukowski
Fryderyk Kukowski on 6 Dec 2024
Yes, you can do it but making it a function makes the code look cleaner and more readable. In your example I would add a comment "Factorial for real numbers" next to the call to gamma function. If I used a function realFactorial instead then it is pretty much self describing and no comment is needed. Also in the future I might forget that adding 1 to argument of gamma function makes it a factorial function for real numbers. realFactorial is easier to remember.
Dyuman Joshi
Dyuman Joshi on 10 Dec 2024
"In your example I would add a comment "Factorial for real numbers" next to the call to gamma function."
That'd be redundant, because that is the mathematical definition of the Gamma function - https://en.wikipedia.org/wiki/Gamma_function.
I highlighted the description because it is technically incorrect.

Sign in to comment.


Walter Roberson
Walter Roberson on 2 Dec 2024
Edited: Walter Roberson on 10 Dec 2024
MatLab 'factorial' is coded so to work with integers only.
More generally: factorial is only defined for non-negative integers.
factorial does not work for numbers with decimals because the very definition of factorial only applies to integers.
If factorial() were to "work" for numbers with decimals, it would have to be defined as either factorial(fix(X)) or factorial(floor(X)) or factorial(round(X))

Products


Release

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!