[Tex/LaTex] I’m searching for a table with cdf of standard normal distribution

calculationstables

I'm searching for a latex version of the mathematical table in german called "standard normalverteilung". Google spits out standard normal distribution but i don't think thats quite right.
its this one: https://de.wikibooks.org/wiki/Tabelle_Standardnormalverteilung

Does somebody know a latex source of the table so i don't have to type it by hand?

Best Answer

Here's a LuaLaTeX-based implementation. It employs Lua code both to calculate the cdf values and to tabulate them in an array environment with 11 columns and 42 rows (including 1 header row).

The algorithm that calculates the cdf at x (for a positive value of x) is based on an approximation proposed in Abramovitz and Stegun, "Handbook of Mathematical Functions" (1964). For more information on this algorithm, see also Abramowitz and Stegun approximation for cumulative normal distribution. The maximum absolute error may be shown to be less than 7.5×10^{−8}. Since the numbers in the table show only 5 digits, the approximation error is negligible for the present use case.


Addendum: If you wanted to use , (comma) as the decimal marker, all you would need to do in the code shown below is (a) add the instructions

\usepackage[output-decimal-marker={,}]{siunitx}
\newcolumntype{T}[1]{S[table-format=#1,group-digits=false]}

in the preamble and (b) change the specification of the array environment from *{11}{l} to T{1.1} *{10}{T{1.5}}.


enter image description here

\documentclass{article} 
\usepackage{luacode}
%% code based on algorithm of Abramovitz and Stegun (1964)
\begin{luacode}
-- x must be positive in Phi(x)
function Phi ( x )
   pdfx = 1/(math.sqrt(2*math.pi)) * math.exp ( -x*x/2 )
   t = 1 / (1+0.2316419*x)
   return ( 1 - pdfx*(0.319381530*t - 0.356563782*t^2
              + 1.781477937*t^3 - 1.821255978*t^4 + 1.330274429*t^5) )
end
-- x can be positive or negative in cdfn(x)
function cdfn ( x ) 
  if ( x==0 ) then
      return ( 0.5 )
  elseif ( x>0 ) then
      return ( Phi ( x ) )
  else
      return ( 1 - Phi ( -x ) ) 
  end
end
-- the table is generated via a set of nested for-loops
function bigloop ()
   -- first, generate the header row
   tex.sprint ( "x" )
   for v=0,9 do
      tex.sprint( "&"..v/100 )
   end
   tex.sprint ( "\\\\[0.5ex]" )
   -- next, 41 rows of calculations
   for u=0,40,1 do
      tex.sprint ( u/10 ) 
      for v=0,9 do
         tex.sprint( "&"..string.format("%.5g", cdfn(u/10+v/100)) )
      end
      tex.sprint ( "\\\\" )
   end
end
\end{luacode}

%% Just in case it's needed: A LaTeX macro to access the cdf value directly
\newcommand\cdfn[1]{\directlua{tex.sprint(cdfn(#1))}}

\usepackage[a4paper,margin=2.5cm]{geometry} % choose page parameters suitably

\begin{document} 
\[
\begin{array}{*{11}{l}}
  \directlua{bigloop()}   % call the Lua function "bigloop" to tabulate the numbers   
\end{array}
\]
\end{document}
Related Question