Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

factorials up to 12 are handled.How can make it to compute beyond that?

Error: “Arithmetic overflow

\documentclass{article}  
\begin{document} 
\newcount\n \newcount\p \newcount\m
\def\factorial#1{{\m=#1\advance\m by 1
\n=1
\p=1
\loop\ifnum\n<\m \multiply\p by \n \advance\n by 1 \repeat\number\p}}

\def\printfactorials#1{\m=#1\advance\m by 1
\n=0
\loop\ifnum\n<\m \hfil\break\number\n! = \factorial{\n} \advance\n by 1 \repeat}

\printfactorials{12}
\end{document} 
share|improve this question
    
! Arithmetic overflow. \iterate ->\ifnum \n <\m \multiply \p by \n \advance \n by 1 \relax \expanda... l.16 \printfactorials{13} –  Andy Apr 10 '12 at 21:32
    
The largest integer that can be used in TeX is 2^31-1 = 2147483647 and 13! exceeds it. TeX is not a computer algebra system, but a typesetting engine. –  egreg Apr 10 '12 at 21:35
3  
Perhaps look at the bigintcalc package, but as @egreg says this is not really the primary purpose of TeX. –  Joseph Wright Apr 10 '12 at 21:37

2 Answers 2

Using bigintcalc (from the oberdiek bundle), you can obtain the following output:

enter image description here

\documentclass{article}
\usepackage{bigintcalc}% http://ctan.org/pkg/bigintcalc
\begin{document} 
\newcount\n \newcount\p \newcount\m
\def\factorial#1{%
  {\m=#1\advance\m by 1
   \n=1
   \p=1
   \loop\ifnum\n<\m \multiply\p by \n \advance\n by 1 \repeat\number\p}}
\def\printfactorials#1{%
  \m=#1\advance\m by 1
  \n=0
  \loop\ifnum\n<\m \hfil\break\number\n! = \factorial{\n} \advance\n by 1 \repeat}

\def\bigfactorial#1{%
  \bigintcalcFac{#1}%
}
\def\printbigfactorials#1{%
  \m=#1\advance\m by 1
  \n=0
  \loop\ifnum\n<\m \hfil\break\number\n! = \bigfactorial{\the\n} \advance\n by 1 \repeat}

%\printfactorials{12}
\printbigfactorials{20}
\end{document} ​

\bigintcalcXXX is the basic operators that are defined. \bigintcalcFac{<x>} returns the factorial of <x>. According to the bigintcalc documentation,

Package bigintcalc defines arithmetic operations that deal with big integers. Big integers can be given either as explicit integer number or as macro code that expands to an explicit number. Big means that there is no limit on the size of the number. Big integers may exceed TeX's range limitation of -2147483647 and 2147483647. Only memory issues will limit the usable range.

share|improve this answer
1  
You lost a fi :-) –  Stephan Lehmke Apr 10 '12 at 22:06
    
@StephanLehmke: Honestly, I was searching my code for a lost \fi. Thanks! –  Werner Apr 12 '12 at 14:07
    
Sorry if I wasted your time with my joke. Copy-paste from PDF can be a nuisance... –  Stephan Lehmke Apr 12 '12 at 14:09

Well mostly the same as Werners answer, but I made an "elementary" implementation of \factorial :-)

\documentclass{article}  
\usepackage{bigintcalc}
\usepackage{fullpage}
\begin{document} 
\def\factorial#1{{\edef\m{\bigintcalcInc{#1}}%
\def\n{1}%
\def\p{1}%
\loop\ifnum\n<\m\relax\edef\p{\bigintcalcMul\p\n}\edef\n{\bigintcalcInc\n}\repeat\p}}

\def\printfactorials#1{\edef\m{\bigintcalcInc{#1}}%
\def\n{0}%
\loop\ifnum\n<\m\relax \hfil\break\n! = \factorial{\n}
\edef\n{\bigintcalcInc\n}\repeat}
\footnotesize
\printfactorials{70}
\end{document} 

example

Well, in fact it wouldn't be neccessary to use bigintcalc in \printfactorials. \edef\p{\bigintcalcMul\p\n} is really the only place where it is needed.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.