\documentclass[a4paper]{article}

\usepackage[intlimits]{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{ifpdf}

\ifpdf
	\usepackage{hyperref}
\else
	\def\pgfsysdriver{pgfsys-dvipdfm.def}
	\usepackage[dvipdfm]{hyperref}
\fi
\usepackage{pgf}
\usepackage{fp}

\makeatletter
\pgfutil@ifundefined{pgfmathdeclarefunction}{
	% load pgfplots with its pgf 2.00 compatibility code:
	\usepackage{pgfplots}
}{
	\usepgflibrary{fpu}
}
\makeatother



\parindent=0pt


\author{Christian Feuers\"anger}
\title{Test cases for pgffloatmath.code.tex}

\def\testsection#1{\message{---------- STARTING TEST SECTION '#1'}\section{#1}}
\def\testsubsection#1{\message{-------STARTING TEST SUBSECTION '#1'}\subsection{#1}}
\def\testsubsubsection#1{\message{------STARTING TEST SUBSUBSECTION '#1'}\subsubsection{#1}}


\def\compare#1#2{%
	\begingroup
	\message{COMPUTING LOG(#1)}%
	\pgfmathlog{#1}%
	\let\actual=\pgfmathresult
	\def\expected{#2}%
	\pgfmathsubtract\actual\expected%
	\let\abserr=\pgfmathresult
	\pgfmathdivide\abserr\expected
	\let\relerr=\pgfmathresult
	\noindent
	log(#1)\hfill=
	\expected;\hfill%
	actual=\actual;\hfill%
	abserr=\abserr;\hfill%
	relerr=\relerr;\hfill%
	\endgroup
	\par
}%
%--------------------------------------------------
% \def\showlowlevelfloat#1#2e#3\relax{%
% 	\ensuremath{[#1] \cdot #2 \cdot 10^{#3}}%
% }%
%-------------------------------------------------- 
\long\def\showlowlevelfloatmacro#1{#1}

\long\def\showlowlevelfloatmacrolong#1{%
	#1 is decomposed into 

	{%
		\gdef\testerror{}%
		\pgfmathfloattoregisters{#1}{\count0 }{\dimen0 }{\count1 }%
		pgfmathfloattoregisters: flags \the\count0; M=\the\dimen0; E=\the\count1
		\ifx\testerror\empty
		\else
			\par (caught \texttt{\testerror})%
		\fi
	}%
		
	{%
		\gdef\testerror{}%
		pgfmathfloattoregisterstok: \pgfmathfloattoregisterstok{#1}{\count0 }{\toks0 }{\count1 }%
		flags \the\count0; M=\the\toks0; E=\the\count1
		\ifx\testerror\empty
		\else
			\par (caught \texttt{\testerror})%
		\fi
	}%

	{%
		\gdef\testerror{}%
		pgfmathfloatgetflags \pgfmathfloatgetflags{#1}{\count0 }
		flags \the\count0;
		\ifx\testerror\empty
		\else
			\par (caught \texttt{\testerror})%
		\fi
	}%

	\medskip
	%\expandafter\showlowlevelfloat#1\relax
}%

\def\showsinglenumberparsing#1{%
%\tracingmacros=2\tracingcommands=2
	\begingroup
	\message{PARSING NUMBER #1...}%
	\gdef\testerror{}%
	\pgfmathfloatparsenumber{#1}%
	\let\resultasfloat=\pgfmathresult
	\pgfmathfloattofixed\resultasfloat
	\let\resultasfixed=\pgfmathresult
	\[ #1 \mapsto \resultasfloat = \showlowlevelfloatmacro\resultasfloat \mapsto \resultasfixed 
	\]
		\ifx\testerror\empty
		\else
			\par (caught \texttt{\testerror})%
		\fi
	\endgroup
%\tracingmacros=0\tracingcommands=0
}

\def\pretty#1{%
	\message{Pretty-printing #1...}%
	\pgfmathprintnumberto{#1}\result
	{\pgfkeys{/pgf/number format/showpos}\pgfmathprintnumberto{#1}\resultpos\global\let\resultpos=\resultpos}%
	\[ #1 \mapsto \pgfmathprintnumber{#1} [=\resultpos] \]
	\message{#1 mapsto \meaning\result}%
}

\begin{document}
\maketitle


%--------------------------------------------------
% \showit{2.8128}
% log(12)=\pgfmathlog{1.2}\pgfmathadd{\pgfmathresult}{2.30258}\pgfmathresult\par
% \showit{1.2}
% \showit{4.0}
% log(1200)=\pgfmathlog{1.2}\pgfmathadd{\pgfmathresult}{6.9077}\pgfmathresult\par
% log(6.241e-7)=\pgfmathlog{6.241}\pgfmathadd{\pgfmathresult}{-16.11809}\pgfmathresult\par
%-------------------------------------------------- 

\testsection{Conversion to normalised floating point numbers basis 10}
\showsinglenumberparsing{123.41251}%
\showsinglenumberparsing{1023.52}
\showsinglenumberparsing{123412.51}%
\showsinglenumberparsing{12341251.0}%
\showsinglenumberparsing{-12341251.0}%
\showsinglenumberparsing{1.2341251}%
\showsinglenumberparsing{8.02410024}
\showsinglenumberparsing{8.024100}
\showsinglenumberparsing{0001234.3100}
\showsinglenumberparsing{0001234.00001}
\showsinglenumberparsing{0001000.00001}
\showsinglenumberparsing{0001000.00001000}
\showsinglenumberparsing{0.12341251}%
\showsinglenumberparsing{0.0012341251}%
\showsinglenumberparsing{0.00000012341251}%
\showsinglenumberparsing{-0.00000012341251}%
\showsinglenumberparsing{10}
\showsinglenumberparsing{100.351}
\showsinglenumberparsing{100.35100}
\showsinglenumberparsing{100.35100234}
\showsinglenumberparsing{100.0035100234}
\showsinglenumberparsing{100}
\showsinglenumberparsing{99999}
\showsinglenumberparsing{999.000}

%\tracingmacros=2 \tracingcommands=2
\showsinglenumberparsing{8.31160034e-02}%
\showsinglenumberparsing{2.54685628e-02}%
\showsinglenumberparsing{7.40715288e-03}%
\showsinglenumberparsing{2.10192154e-03}%
\showsinglenumberparsing{5.87352989e-04}%
\showsinglenumberparsing{-1.62269942e-04}%
\showsinglenumberparsing{4.44248889e-05}%
\showsinglenumberparsing{1.20714122e-05}%
\showsinglenumberparsing{3.26101452e-06}%
\showsinglenumberparsing{3261.01452e-06}%
\showsinglenumberparsing{0.000326101452e-06}%
\showsinglenumberparsing{1.2345e-12}%
\showsinglenumberparsing{1.2345e+12}%

\message{SPECIAL CASE 0}%
\showsinglenumberparsing{0}
\showsinglenumberparsing{-0}
\showsinglenumberparsing{-0.000}
\showsinglenumberparsing{+0.000}
\showsinglenumberparsing{+0}
\showsinglenumberparsing{-1}
\showsinglenumberparsing{1.0e1}
\showsinglenumberparsing{1e1}
\showsinglenumberparsing{1141}
\showsinglenumberparsing{-53e-5}

\testsubsection{Error handling}
{
	\pgfkeys{
		/pgf/fpu/handlers/empty number/.code 2 args={%
			\gdef\testerror{handlers/empty number=\{#1\}\{#2\}}%
		},
		/pgf/fpu/handlers/invalid number/.code 2 args={%
			\gdef\testerror{handlers/invalid number=\{#1\}\{#2\}}%
		},
		/pgf/fpu/handlers/wrong lowlevel format/.code 2 args={%
			\gdef\testerror{handlers/wrong lowlevel format=\{#1\}\{#2\}}%
		},
	}
	\showsinglenumberparsing{-53e-5 not terminated}
	%\showsinglenumberparsing{-53e-}
	\showsinglenumberparsing{}
	\showsinglenumberparsing{ ASDZ@414e12}

	This one has trailing spaces and should work:
	\showsinglenumberparsing{10   }

	This one has leading spaces and should work:
	\showsinglenumberparsing{   10}

	\testsubsection{Error handling of decompose routines}

	\pgfmathfloatparsenumber{100}
	\showlowlevelfloatmacrolong{\pgfmathresult}
		
	\showlowlevelfloatmacrolong{132}

	\showlowlevelfloatmacrolong{Z}
}

\testsection{logarithms, compared with PGF arithmetics}

\compare{0.1}{-2.30259}
\compare{0.12}{-2.12026}
\compare{0.2}{-1.60944}
\compare{0.3}{-1.20397}
\compare{0.4}{-0.916291}
\compare{0.5}{-0.693147}
\compare{0.6}{-0.510826}
\compare{0.7}{-0.356675}
\compare{0.75}{-0.287682}
\compare{0.8}{-0.223144}
\compare{0.823}{-0.194799}
\compare{0.9}{-0.105361}
\compare{0.96}{-0.040822}
\compare{1.2}{0.182322}
\compare{1.5}{0.405465}
\compare{1.6}{0.470004}
\compare{9.0}{2.1972245773}
\compare{9.2}{2.2192034}
\compare{9.3}{2.23001440}
\compare{9.7}{2.27212588}
\compare{10.0}{2.302585092}
\compare{100.0}{4.605170185}
\compare{1351.0}{7.208600337}
\compare{9752.0}{9.185227671}
\compare{9600.0}{9.169518377}

\vskip1cm
\compare{0.000142}{-8.8596835}
\compare{0.0054124}{-5.219062661}
\compare{0.000912697124}{-6.9991064}

\vskip1cm
\compare{8.31160034e-02}{-2.48751801563782}%
\compare{2.54685628e-02}{-3.67031041875206}%
\compare{7.40715288e-03}{-4.90530914022879}%
\compare{2.10192154e-03}{-6.16490333357987}%
\compare{5.87352989e-04}{-7.43988457474844}%
\compare{1.62269942e-04}{-8.72624930084187}%
\compare{4.44248889e-05}{-10.0217106847708}%
\compare{1.20714122e-05}{-11.3246705288704}%
\compare{3.26101452e-06}{-12.6334722085451}%

\vskip1cm
\compare{5}{1.6094379124341}%
\compare{17}{2.83321334405622}%
\compare{39}{3.66356164612965}%
\compare{49}{3.89182029811063}%
\compare{129}{4.85981240436167}%
\compare{321}{5.77144112313002}%
\compare{769}{6.64509096950564}%
\compare{1793}{7.49164547360513}%
\compare{4097}{8.31801027754687}%
\compare{9217}{9.12880488399366}%


\testsection{Test for prettyprinter}
%\tracingmacros=2\tracingcommands=2
\message{PRETTY PRINTING}
{
\twocolumn
\def\prettytest{%
	\pretty{1}
	\pretty{1.0}
	\pretty{-1.02311}
	\pretty{-11241.02311}
	\pretty{-11241}
	\pretty{8124.99999}
	\pretty{8124.849999}
	\pretty{8124.843333}
	\pretty{8.82}
	\pretty{8.5}
	\pretty{9.}
	\pretty{5.9}
	\pretty{-0.00001}
	\pretty{-1.00001}
	\pretty{-0.559}
	\pretty{-0.554}
	\pretty{-0.00000141}
	\pretty{1.234e10}
	\pretty{123456781}
	\pretty{1234}
	\pretty{8}
	\pretty{-9.995}
	\pretty{-0.015}
	\pretty{-0.1}
	\pretty{-0.15}
	\pretty{0.15}
	\pretty{-0}
	\pretty{0}
	\pretty{9.00}
	\pretty{200.01}
	\pretty{200.0000}
	\pretty{1.5e-7}
	\pretty{0.00035}
	\pretty{0.00005}
	\pretty{nan}
	\pretty{inf}
	\pretty{-inf}
	\pretty{10}
	\pretty{100}
	\pretty{200}
	\pretty{500}
	\pretty{1000}
	\pretty{30000}
	\pretty{600000}
	\pretty{1000000}
	\pretty{30000000}
	\pretty{600000000}
	\pretty{1000000000}
	\pretty{-10}
	\pretty{-100}
	\pretty{-200}
	\pretty{-500}
	\pretty{-1000}
	\pretty{-30000}
	\pretty{-600000}
	\pretty{-1000000}
	\pretty{-30000000}
	\pretty{-600000000}
	\pretty{-1000000000}
}

\testsubsection{STD format}
\pgfqkeys{/pgf/number format}{std}
\prettytest

{
\testsubsubsection{precision 0}
\pgfqkeys{/pgf/number format}{precision=0}
\prettytest
}

{
\testsubsection{FIXED format}
\testsubsubsection{with period}
\pgfqkeys{/pgf/number format}{fixed,use period}
\prettytest

{
\testsubsubsection{precision 0}
\pgfqkeys{/pgf/number format}{precision=0}
\prettytest
}
{
\testsubsubsection{skip 0.=true}
\pgfqkeys{/pgf/number format}{skip 0.=true}
\prettytest
}

{
\testsubsubsection{1000 sep; min exponent for 1000 sep=4}
\pgfqkeys{/pgf/number format}{1000 sep=',min exponent for 1000 sep=4}
\prettytest
}

\testsubsubsection{with comma}
\pgfqkeys{/pgf/number format}{fixed,use comma}
\prettytest
}


{
\testsubsection{FIXED ZEROFILL format}
\testsubsubsection{with period}
\pgfqkeys{/pgf/number format}{fixed,fixed zerofill,use period}
\prettytest

{
\testsubsubsection{precision 0}
\pgfqkeys{/pgf/number format}{precision=0}
\prettytest
}

\testsubsubsection{with comma}
\pgfqkeys{/pgf/number format}{fixed,fixed zerofill,use comma}
%\tracingmacros=2\tracingcommands=2
\prettytest
%\tracingmacros=0\tracingcommands=0
}

{
\testsubsection{sci format}
\testsubsubsection{with period}
\pgfqkeys{/pgf/number format}{sci,use period}
\prettytest

{
\testsubsubsection{precision 0}
\pgfqkeys{/pgf/number format}{precision=0}
\prettytest
}

\testsubsubsection{with comma}
\pgfqkeys{/pgf/number format}{sci,use comma}
\prettytest

%\testsubsection{may skip mantisse}
%\pgfqkeys{/pgf/number format}{sci may skip mantisse=true}
%\prettytest

}{
\testsubsection{sci format zerofill}
\testsubsubsection{with period}
\pgfqkeys{/pgf/number format}{sci,sci zerofill,use period}
\prettytest

\testsubsubsection{with comma}
\pgfqkeys{/pgf/number format}{sci,sci zerofill,use comma}
\prettytest

\testsubsubsection{e-style}
\pgfqkeys{/pgf/number format}{sci e}
\prettytest

\testsubsubsection{subscript-style}
\pgfqkeys{/pgf/number format}{sci subscript}
\prettytest

\testsubsubsection{subscript-style + period + no zero fill}
\pgfqkeys{/pgf/number format}{sci subscript,use period,sci}
\prettytest

\testsubsubsection{subscript-style precision 4}
\pgfqkeys{/pgf/number format}{sci subscript,precision=4}
\prettytest
}

\testsubsection{int trunc format}
\pgfqkeys{/pgf/number format}{int trunc}
\prettytest

\testsubsection{int detect format}
\pgfqkeys{/pgf/number format}{int detect}
\prettytest

\testsubsection{frac}
\pgfqkeys{/pgf/number format}{frac}
\pretty{0.333333333333333}
\pretty{0.5}
\pretty{2.133333333333325e-01}%
\pretty{0.12}
\pretty{2.666666666666646e-02}%
\pretty{-1.333333333333334e-02}%
\pretty{7.200000000000000e-01}%
\pretty{6.666666666666667e-02}%
\pretty{1.333333333333333e-01}%
\pretty{-1.333333333333333e-02}%
\pretty{8.533333333333298e-01}
\pretty{8.533333e-01}
}
\onecolumn

\begingroup
\testsection{testing pgfmathfloatadd}
\def\testfloataddnonsymmetric#1#2{%
	\pgfmathfloatparsenumber{#1}%
	\let\first=\pgfmathresult
	\pgfmathfloatparsenumber{#2}%
	\let\second=\pgfmathresult
	\message{computing #1 + #2;  \first + \second}%
	\pgfmathfloatadd\first\second
	\let\result=\pgfmathresult
	\pgfmathfloattofixed\result
	\let\resultfixed=\pgfmathresult
	\[ \text{pgfmathfloatadd: }  \showlowlevelfloatmacro\first  +  \showlowlevelfloatmacro\second = \showlowlevelfloatmacro\result \; \bigl( #1 + #2 = \resultfixed \bigr). \]
}%
\def\testfloatadd#1#2{%
	\testfloataddnonsymmetric{#1}{#2}%
	\testfloataddnonsymmetric{#2}{#1}%
}%

\testfloatadd{1}{100}
\testfloatadd{100}{100}
\testfloatadd{1}{2}
\testfloatadd{1}{0}
\testfloatadd{9.999999}{0}
\testfloatadd{9.9999}{0.0001}
\testfloatadd{9.9999e-5}{0.0001e-5}
\testfloatadd{1e6}{1e5}
\testfloatadd{1e6}{1e3}
\testfloatadd{1e6}{1}
\testfloatadd{1e6}{0.1}

\testfloatadd{1}{-100}
\testfloatadd{100}{-100}
\testfloatadd{1}{-2}
\testfloatadd{1e6}{-1e5}
\testfloatadd{1e6}{-1e3}
\testfloatadd{1e6}{-1}
\testfloatadd{1e6}{-0.1}

\testfloatadd{1e-3}{0}

\testfloatadd{inf}{0}
\testfloatadd{inf}{5}
\testfloatadd{nan}{5}
\testfloatadd{0}{0}
\testfloatadd{-inf}{inf}
\testfloatadd{-inf}{40}
\endgroup

\begingroup
\testsection{testing pgfmathfloatmultiplyfixed}
\def\testfloatmultiplyfixed#1#2{%
	\pgfmathfloatparsenumber{#1}%
	\let\first=\pgfmathresult
	\pgfmathfloatparsenumber{#2}%
	\pgfmathfloattofixed\pgfmathresult
	\let\second=\pgfmathresult
	\message{computing #1 * #2;  \first * \second}%
	\pgfmathfloatmultiplyfixed\first\second
	\let\result=\pgfmathresult
	\pgfmathfloattofixed\result
	\let\resultfixed=\pgfmathresult
	\[ \text{pgfmathfloatmultiplyfixed: }  \showlowlevelfloatmacro\first  \cdot \second = \showlowlevelfloatmacro\result \; \bigl( #1 \cdot #2 = \resultfixed \bigr). \]
}%

\testfloatmultiplyfixed{1}{100}
\testfloatmultiplyfixed{100}{100}
\testfloatmultiplyfixed{1}{2}
\testfloatmultiplyfixed{5}{2}
\testfloatmultiplyfixed{5e4}{10}
\testfloatmultiplyfixed{1}{0}
\testfloatmultiplyfixed{9.999999}{0}
\testfloatmultiplyfixed{9.9999}{0.0001}
\testfloatmultiplyfixed{9.9999e-5}{0.001}
\testfloatmultiplyfixed{1e6}{4}
\testfloatmultiplyfixed{1e6}{100}
\testfloatmultiplyfixed{1e6}{1}
\testfloatmultiplyfixed{1e6}{0.1}

\testfloatmultiplyfixed{1}{-100}
\testfloatmultiplyfixed{100}{-100}
\testfloatmultiplyfixed{1}{-2}
\testfloatmultiplyfixed{1e6}{-9}
\testfloatmultiplyfixed{1e6}{-100}
\testfloatmultiplyfixed{1e6}{-1}
\testfloatmultiplyfixed{1e6}{-0.1}

\testfloatmultiplyfixed{1e-3}{0}

\testfloatmultiplyfixed{inf}{0}
\testfloatmultiplyfixed{inf}{5}
\testfloatmultiplyfixed{nan}{5}
\testfloatmultiplyfixed{0}{0}
\testfloatmultiplyfixed{-inf}{40}
\endgroup


\testsection{testing pgfmathfloatlessthan}
\def\testfloatlessthan#1#2{%
	\pgfmathfloatparsenumber{#1}%
	\let\first=\pgfmathresult
	\pgfmathfloatparsenumber{#2}%
	\let\second=\pgfmathresult
	\message{checking #1 <= #2;  \first <= \second}%
	\pgfmathfloatlessthan\first\second
	\ifpgfmathfloatcomparison
		\def\result{<}%
	\else
		\def\result{\ge}%
	\fi
	\[ \text{pgfmathfloatlessthan: } \bigl( \showlowlevelfloatmacro\first \bigr)\; = #1 \result #2\; \bigl( = \showlowlevelfloatmacro\second \big). \]
}%

\testfloatlessthan{4}{5}
\testfloatlessthan{0}{2}
\testfloatlessthan{91751123}{241924}
\testfloatlessthan{-1}{-1}
\testfloatlessthan{-1231}{0}
\testfloatlessthan{10}{-5}
\testfloatlessthan{0}{0}
\testfloatlessthan{-0}{-0}
\testfloatlessthan{0}{14}
\testfloatlessthan{114812}{-123124123}
\testfloatlessthan{114812}{1241231451}
\testfloatlessthan{-141285}{29}
\testfloatlessthan{-141285}{0}
\testfloatlessthan{-141285}{-50}
\testfloatlessthan{-141285}{-12498149012}

\testsection{float to fixed test}
\def\testpgfmathfloattofixed#1{%
	\pgfmathfloatparsenumber{#1}%
%\tracingmacros=2\tracingcommands=2
	\let\argument=\pgfmathresult
	\message{converting #1 = \argument\  to fixed point}%
	\pgfmathfloattofixed\argument
	\let\result=\pgfmathresult
	\message{-> \result}%
%\tracingmacros=0\tracingcommands=0
	\[ \bigl( \showlowlevelfloatmacro\argument \bigr)\; = #1 \mapsto \result \]
}%
\testpgfmathfloattofixed{0}
\testpgfmathfloattofixed{5}
\testpgfmathfloattofixed{5.520241}
\testpgfmathfloattofixed{124.10241}
\testpgfmathfloattofixed{-121.248}
\testpgfmathfloattofixed{-12e-5}
\testpgfmathfloattofixed{412e3}
\testpgfmathfloattofixed{0.0001}
\testpgfmathfloattofixed{0.0}
\testpgfmathfloattofixed{-0.012125}
\testpgfmathfloattofixed{1.2e-1}
\testpgfmathfloattofixed{1.2e-2}
\testpgfmathfloattofixed{1.2e4}
\testpgfmathfloattofixed{1.2345e4}
\testpgfmathfloattofixed{1.234567e4}
\testpgfmathfloattofixed{1.51234e0}
\testpgfmathfloattofixed{15}
\testpgfmathfloattofixed{-20}

\testsection{Testing pgfmathfloatmin and pgfmathfloatmax}
\def\testfloatminmax#1#2{%
	\pgfmathfloatparsenumber{#1}%
	\let\first=\pgfmathresult
	\pgfmathfloatparsenumber{#2}%
	\let\second=\pgfmathresult
%\tracingmacros=2\tracingcommands=2
	\message{computing min/max #1 and #2}%
	\pgfmathfloatmin\first\second
	\let\result=\pgfmathresult
	\pgfmathfloattofixed\result
	\[ \min\{#1,#2\} = \min\{ \showlowlevelfloatmacro\first, \showlowlevelfloatmacro\second \} \; = \showlowlevelfloatmacro\result = \pgfmathresult \]
	%
	\pgfmathfloatmax\first\second
	\let\result=\pgfmathresult
	\pgfmathfloattofixed\result
	\[ \max\{#1,#2\} = \max\{ \showlowlevelfloatmacro\first, \showlowlevelfloatmacro\second \} \; = \showlowlevelfloatmacro\result = \pgfmathresult \]
}%
\testfloatminmax{42}{56}
\testfloatminmax{-4122}{1256}
\testfloatminmax{1e12}{5.235412e24}
\testfloatminmax{-12}{-145}

\testsection{Testing pgfmathfloatshift}
\def\pgfmathfloatshifttest#1#2{%
	\pgfmathfloatparsenumber{#1}%
	\let\argument=\pgfmathresult
	\message{computing mathshift #1 by #2}%
	\pgfmathfloatshift\argument{#2}%
	\let\result=\pgfmathresult
	\pgfmathfloattofixed\result
	\[ #1 \cdot 10^{#2} = \showlowlevelfloatmacro\argument \cdot 10^{#2} = \showlowlevelfloatmacro\result = \pgfmathresult \]
}%
\pgfmathfloatshifttest{4}{1}
\pgfmathfloatshifttest{4}{2}
\pgfmathfloatshifttest{4}{-1}
\pgfmathfloatshifttest{4}{-2}
\pgfmathfloatshifttest{0}{-2}
\pgfmathfloatshifttest{1.1415130}{-2}
\pgfmathfloatshifttest{1.1415130}{5}

\testsection{Testing pgfmathfloatmultiply}
\begingroup
\def\pgfmathfloatmultiplytest#1#2{%
	\pgfmathfloatparsenumber{#1}%
	\let\argumenta=\pgfmathresult
	\pgfmathfloatparsenumber{#2}%
	\let\argumentb=\pgfmathresult
	\message{computing mathmultiply #1 by #2}%
	\pgfmathfloatmultiply\argumenta\argumentb%
	\let\result=\pgfmathresult
	\pgfmathfloattofixed\result
	\[ #1 \cdot #2 = \showlowlevelfloatmacro\result = \pgfmathresult \]
}%
\def\tests{%
	\pgfmathfloatmultiplytest{4}{1}
	\pgfmathfloatmultiplytest{4}{2}
	\pgfmathfloatmultiplytest{4}{-1}
	\pgfmathfloatmultiplytest{4}{-2}
	\pgfmathfloatmultiplytest{0}{-2}
	\pgfmathfloatmultiplytest{1.1415130}{-2}
	\pgfmathfloatmultiplytest{1.1415130}{5}
	\pgfmathfloatmultiplytest{10}{10}
	\pgfmathfloatmultiplytest{100}{100}
	\pgfmathfloatmultiplytest{9999999}{9999999}
	gnuplot for $\cdot$: $99999980000001.0$
	\pgfmathfloatmultiplytest{-10}{10}
	\pgfmathfloatmultiplytest{-90}{3}
	\pgfmathfloatmultiplytest{-90}{-3}
	\pgfmathfloatmultiplytest{-inf}{nan}
	\pgfmathfloatmultiplytest{-inf}{+inf}
	\pgfmathfloatmultiplytest{1}{0}
	\pgfmathfloatmultiplytest{1}{0}
	\pgfmathfloatmultiplytest{1}{-0}
	\pgfmathfloatmultiplytest{3.14159265358979}{2}
}%
\tests

\testsection{Testing pgfmathfloatdivide}

\def\pgfmathfloatmultiplytest#1#2{%
	\pgfmathfloatparsenumber{#1}%
	\let\argumenta=\pgfmathresult
	\pgfmathfloatparsenumber{#2}%
	\let\argumentb=\pgfmathresult
	\message{computing mathdivide #1 by #2}%
	\pgfmathfloatdivide\argumenta\argumentb%
	\let\result=\pgfmathresult
	\pgfmathfloattofixed\result
	\[ #1 / #2 = \showlowlevelfloatmacro\result = \pgfmathresult \]
}%
\tests
\endgroup


{
\testsection{Testing pgfmathfloatsqrt}
% #1 : number
% #2 : the reference, sqrt (#1)
\def\pgfmathfloatsqrttest#1#2{%
	\pgfmathfloatparsenumber{#1}%
	\let\argumenta=\pgfmathresult
	\pgfmathfloatparsenumber{#2}%
	\let\reference=\pgfmathresult
	\message{computing sqrt(#1)}%
	\pgfmathfloatsqrt\argumenta%
	\let\resultfloat=\pgfmathresult
	\pgfmathfloattosci\pgfmathresult
	\let\result=\pgfmathresult
	\pgfmathfloatrelerror\resultfloat\reference
	\pgfmathfloattosci\pgfmathresult
	\[ \sqrt{#1} =  \result\quad (\text{rel. error } \pgfmathresult)\]
}%
\def\tests{%
	\pgfmathfloatsqrttest{0}{0}
	\pgfmathfloatsqrttest{1}{1}
	\pgfmathfloatsqrttest{2}{1.414213562373}
	\pgfmathfloatsqrttest{4}{2}
	\pgfmathfloatsqrttest{16}{4}
	\pgfmathfloatsqrttest{10}{3.162277660168}
	\pgfmathfloatsqrttest{1000000}{1000}
	\pgfmathfloatsqrttest{123456789}{1.111111106055556e+04}
}%
\tests
}

{
\testsection{Testing pgfmathfloatint}
% #1 : number
\def\pgfmathfloatinttest#1{%
	\pgfmathfloatparsenumber{#1}%
	\let\argumenta=\pgfmathresult
	\message{computing int(#1)}%
	\pgfmathfloatint\argumenta%
	\pgfmathfloattosci\pgfmathresult
	\let\result=\pgfmathresult
	\[ int(#1) =  \result \]
	%
	\pgfmathfloatparsenumber{-#1}%
	\let\argumenta=\pgfmathresult
	\message{computing int(-#1)}%
	\pgfmathfloatint\argumenta%
	\pgfmathfloattosci\pgfmathresult
	\let\result=\pgfmathresult
	\[ int(-#1) =  \result \]
}%
\def\tests{%
	\pgfmathfloatinttest{1.23}
	\pgfmathfloatinttest{12.34}
	\pgfmathfloatinttest{123.4}
	\pgfmathfloatinttest{1234.}
	\pgfmathfloatinttest{1234.1}
	\pgfmathfloatinttest{1e-2}
	\pgfmathfloatinttest{0}
	\pgfmathfloatinttest{3.456789e4}
	\pgfmathfloatinttest{3.456789e10}
}%
\tests
}

{
\testsection{Testing pgfmathfloatexp}
% #1 : number
% #2 : the reference, sqrt (#1)
\def\pgfmathfloattest#1#2{%
	\pgfmathfloatparsenumber{#1}%
	\let\argumenta=\pgfmathresult
	\pgfmathfloatparsenumber{#2}%
	\let\reference=\pgfmathresult
	\message{computing (#1)}%
	\pgfmathfloatexp\argumenta%
	\let\resultfloat=\pgfmathresult
	\pgfmathfloattosci\pgfmathresult
	\let\result=\pgfmathresult
	\pgfmathfloatrelerror\resultfloat\reference
	\pgfmathfloattosci\pgfmathresult
	\[ \exp(#1) =  \result\quad (\text{error/r to }#2 = \pgfmathresult)\]
}%
%\tracingmacros=2\tracingcommands=2
	\pgfmathfloattest{-700}{9.85967654375977e-305}
	\pgfmathfloattest{-1.0000000e+02}{3.7200760e-44}
	\pgfmathfloattest{-9.5918367e+01}{2.2038516e-42}
	\pgfmathfloattest{-9.1836735e+01}{1.3056083e-40}
	\pgfmathfloattest{-8.7755102e+01}{7.7346991e-39}
	\pgfmathfloattest{-8.3673469e+01}{4.5821992e-37}
	\pgfmathfloattest{-7.9591837e+01}{2.7145916e-35}
	\pgfmathfloattest{-7.5510204e+01}{1.6081814e-33}
	\pgfmathfloattest{-7.1428571e+01}{9.5272065e-32}
	\pgfmathfloattest{-6.7346939e+01}{5.6441184e-30}
	\pgfmathfloattest{-6.3265306e+01}{3.3436950e-28}
	\pgfmathfloattest{-5.9183673e+01}{1.9808756e-26}
	\pgfmathfloattest{-5.5102041e+01}{1.1735125e-24}
	\pgfmathfloattest{-5.1020408e+01}{6.9521362e-23}
	\pgfmathfloattest{-4.6938776e+01}{4.1185924e-21}
	\pgfmathfloattest{-4.2857143e+01}{2.4399411e-19}
	\pgfmathfloattest{-3.8775510e+01}{1.4454727e-17}
	\pgfmathfloattest{-3.4693878e+01}{8.5632855e-16}
	\pgfmathfloattest{-3.0612245e+01}{5.0730713e-14}
	\pgfmathfloattest{-2.6530612e+01}{3.0053946e-12}
	\pgfmathfloattest{-2.2448980e+01}{1.7804593e-10}
	\pgfmathfloattest{-1.8367347e+01}{1.0547817e-08}
	\pgfmathfloattest{-1.4285714e+01}{6.2487495e-07}
	\pgfmathfloattest{-1.0204082e+01}{3.7018912e-05}
	\pgfmathfloattest{-6.1224490e+00}{2.1930786e-03}
	\pgfmathfloattest{-2.0408163e+00}{1.2992261e-01}
	\pgfmathfloattest{2.0408163e+00}{7.6968898e+00}
	\pgfmathfloattest{6.1224490e+00}{4.5598001e+02}
	\pgfmathfloattest{1.0204082e+01}{2.7013219e+04}
	\pgfmathfloattest{1.4285714e+01}{1.6003202e+06}
	\pgfmathfloattest{1.8367347e+01}{9.4806349e+07}
	\pgfmathfloattest{2.2448980e+01}{5.6165284e+09}
	\pgfmathfloattest{2.6530612e+01}{3.3273501e+11}
	\pgfmathfloattest{3.0612245e+01}{1.9711925e+13}
	\pgfmathfloattest{3.4693878e+01}{1.1677761e+15}
	\pgfmathfloattest{3.8775510e+01}{6.9181522e+16}
	\pgfmathfloattest{4.2857143e+01}{4.0984595e+18}
	\pgfmathfloattest{4.6938776e+01}{2.4280140e+20}
	\pgfmathfloattest{5.1020408e+01}{1.4384068e+22}
	\pgfmathfloattest{5.5102041e+01}{8.5214258e+23}
	\pgfmathfloattest{5.9183673e+01}{5.0482727e+25}
	\pgfmathfloattest{6.3265306e+01}{2.9907034e+27}
	\pgfmathfloattest{6.7346939e+01}{1.7717559e+29}
	\pgfmathfloattest{7.1428571e+01}{1.0496256e+31}
	\pgfmathfloattest{7.5510204e+01}{6.2182039e+32}
	\pgfmathfloattest{7.9591837e+01}{3.6837954e+34}
	\pgfmathfloattest{8.3673469e+01}{2.1823582e+36}
	\pgfmathfloattest{8.7755102e+01}{1.2928751e+38}
	\pgfmathfloattest{9.1836735e+01}{7.6592653e+39}
	\pgfmathfloattest{9.5918367e+01}{4.5375106e+41}
	\pgfmathfloattest{1.0000000e+02}{2.6881171e+43}
	\pgfmathfloattest{700}{1.014232054735e+304}
}

{
\testsection{Testing pgfmathfloatmod}
% #1 : operand 1
% #2 : operand 2
% #3 : the reference, #1 mod #2
\def\pgfmathfloattest#1#2#3{%
	\pgfmathfloatparsenumber{#1}%
	\let\argumenta=\pgfmathresult
	\pgfmathfloatparsenumber{#2}%
	\let\argumentb=\pgfmathresult
	\pgfmathfloatparsenumber{#3}%
	\let\reference=\pgfmathresult
	\message{computing #1 mod #2}%
	\pgfmathfloatmod\argumenta\argumentb%
	\let\resultfloat=\pgfmathresult
	\pgfmathfloattosci\pgfmathresult
	\let\result=\pgfmathresult
	\pgfmathfloatrelerror\resultfloat\reference
	\pgfmathfloattosci\pgfmathresult
	\[ #1\text{ mod }#2 =  \result\quad (\text{error/r to }#3 = \pgfmathresult)\]
}%
%\tracingmacros=2\tracingcommands=2
	\pgfmathfloattest{4}{3}{1}
	\pgfmathfloattest{10}{10}{0}
	\pgfmathfloattest{20}{6}{2}
	\pgfmathfloattest{-100}{30}{-10}
	\pgfmathfloattest{10.5}{5}{0.5}
	\pgfmathfloattest{300.63}{360}{300.63}
	\pgfmathfloattest{-20}{30}{-20}
}

{
\testsection{Testing Trigonometric functions}
% #1 : operator
% #2 : operand
% #3 : the reference, #2(#1)
\def\pgfmathfloattest#1#2#3{%
	\pgfmathfloatparsenumber{#2}%
	\let\argumenta=\pgfmathresult
	\pgfmathfloatparsenumber{#3}%
	\let\reference=\pgfmathresult
	\message{computing \string#1(#2)}%
	#1\argumenta%
	\let\resultfloat=\pgfmathresult
	\pgfmathfloattosci\pgfmathresult
	\let\result=\pgfmathresult
	\pgfmathfloatrelerror\resultfloat\reference
	\pgfmathfloattosci\pgfmathresult
	\[ \string#1(#2) =  \result\quad (\text{error/r to }#3 = \pgfmathresult)\]
}%
%\tracingmacros=2\tracingcommands=2
\testsubsection{SIN}
	\pgfmathfloattest\pgfmathfloatsin{-7.2000000e+02}{4.8985872e-16}
	\pgfmathfloattest\pgfmathfloatsin{-6.5454545e+02}{9.0963200e-01}
	\pgfmathfloattest\pgfmathfloatsin{-5.8909091e+02}{7.5574957e-01}
	\pgfmathfloattest\pgfmathfloatsin{-5.2363636e+02}{-2.8173256e-01}
	\pgfmathfloattest\pgfmathfloatsin{-4.5818182e+02}{-9.8982144e-01}
	\pgfmathfloattest\pgfmathfloatsin{-3.9272727e+02}{-5.4064082e-01}
	\pgfmathfloattest\pgfmathfloatsin{-3.2727273e+02}{5.4064082e-01}
	\pgfmathfloattest\pgfmathfloatsin{-2.6181818e+02}{9.8982144e-01}
	\pgfmathfloattest\pgfmathfloatsin{-1.9636364e+02}{2.8173256e-01}
	\pgfmathfloattest\pgfmathfloatsin{-1.3090909e+02}{-7.5574957e-01}
	\pgfmathfloattest\pgfmathfloatsin{-6.5454545e+01}{-9.0963200e-01}
	\pgfmathfloattest\pgfmathfloatsin{0.0000000e+00}{0.0000000e+00}
	\pgfmathfloattest\pgfmathfloatsin{6.5454545e+01}{9.0963200e-01}
	\pgfmathfloattest\pgfmathfloatsin{1.3090909e+02}{7.5574957e-01}
	\pgfmathfloattest\pgfmathfloatsin{1.9636364e+02}{-2.8173256e-01}
	\pgfmathfloattest\pgfmathfloatsin{2.6181818e+02}{-9.8982144e-01}
	\pgfmathfloattest\pgfmathfloatsin{3.2727273e+02}{-5.4064082e-01}
	\pgfmathfloattest\pgfmathfloatsin{3.9272727e+02}{5.4064082e-01}
	\pgfmathfloattest\pgfmathfloatsin{4.5818182e+02}{9.8982144e-01}
	\pgfmathfloattest\pgfmathfloatsin{5.2363636e+02}{2.8173256e-01}
	\pgfmathfloattest\pgfmathfloatsin{5.8909091e+02}{-7.5574957e-01}
	\pgfmathfloattest\pgfmathfloatsin{6.5454545e+02}{-9.0963200e-01}
	\pgfmathfloattest\pgfmathfloatsin{7.2000000e+02}{-4.8985872e-16}



\testsubsection{COS}
	\pgfmathfloattest\pgfmathfloatcos{-7.2000000e+02}{1.0000000e+00}
	\pgfmathfloattest\pgfmathfloatcos{-6.5454545e+02}{4.1541501e-01}
	\pgfmathfloattest\pgfmathfloatcos{-5.8909091e+02}{-6.5486073e-01}
	\pgfmathfloattest\pgfmathfloatcos{-5.2363636e+02}{-9.5949297e-01}
	\pgfmathfloattest\pgfmathfloatcos{-4.5818182e+02}{-1.4231484e-01}
	\pgfmathfloattest\pgfmathfloatcos{-3.9272727e+02}{8.4125353e-01}
	\pgfmathfloattest\pgfmathfloatcos{-3.2727273e+02}{8.4125353e-01}
	\pgfmathfloattest\pgfmathfloatcos{-2.6181818e+02}{-1.4231484e-01}
	\pgfmathfloattest\pgfmathfloatcos{-1.9636364e+02}{-9.5949297e-01}
	\pgfmathfloattest\pgfmathfloatcos{-1.3090909e+02}{-6.5486073e-01}
	\pgfmathfloattest\pgfmathfloatcos{-6.5454545e+01}{4.1541501e-01}
	\pgfmathfloattest\pgfmathfloatcos{0.0000000e+00}{1.0000000e+00}
	\pgfmathfloattest\pgfmathfloatcos{6.5454545e+01}{4.1541501e-01}
	\pgfmathfloattest\pgfmathfloatcos{1.3090909e+02}{-6.5486073e-01}
	\pgfmathfloattest\pgfmathfloatcos{1.9636364e+02}{-9.5949297e-01}
	\pgfmathfloattest\pgfmathfloatcos{2.6181818e+02}{-1.4231484e-01}
	\pgfmathfloattest\pgfmathfloatcos{3.2727273e+02}{8.4125353e-01}
	\pgfmathfloattest\pgfmathfloatcos{3.9272727e+02}{8.4125353e-01}
	\pgfmathfloattest\pgfmathfloatcos{4.5818182e+02}{-1.4231484e-01}
	\pgfmathfloattest\pgfmathfloatcos{5.2363636e+02}{-9.5949297e-01}
	\pgfmathfloattest\pgfmathfloatcos{5.8909091e+02}{-6.5486073e-01}
	\pgfmathfloattest\pgfmathfloatcos{6.5454545e+02}{4.1541501e-01}
	\pgfmathfloattest\pgfmathfloatcos{7.2000000e+02}{1.0000000e+00}


\testsubsection{TAN}
	\pgfmathfloattest\pgfmathfloattan{-7.2000000e+02}{4.8985872e-16}
	\pgfmathfloattest\pgfmathfloattan{-6.5454545e+02}{2.1896946e+00}
	\pgfmathfloattest\pgfmathfloattan{-5.8909091e+02}{-1.1540615e+00}
	\pgfmathfloattest\pgfmathfloattan{-5.2363636e+02}{2.9362649e-01}
	\pgfmathfloattest\pgfmathfloattan{-4.5818182e+02}{6.9551528e+00}
	\pgfmathfloattest\pgfmathfloattan{-3.9272727e+02}{-6.4266098e-01}
	\pgfmathfloattest\pgfmathfloattan{-3.2727273e+02}{6.4266098e-01}
	\pgfmathfloattest\pgfmathfloattan{-2.6181818e+02}{-6.9551528e+00}
	\pgfmathfloattest\pgfmathfloattan{-1.9636364e+02}{-2.9362649e-01}
	\pgfmathfloattest\pgfmathfloattan{-1.3090909e+02}{1.1540615e+00}
	\pgfmathfloattest\pgfmathfloattan{-6.5454545e+01}{-2.1896946e+00}
	\pgfmathfloattest\pgfmathfloattan{0.0000000e+00}{0.0000000e+00}
	\pgfmathfloattest\pgfmathfloattan{6.5454545e+01}{2.1896946e+00}
	\pgfmathfloattest\pgfmathfloattan{1.3090909e+02}{-1.1540615e+00}
	\pgfmathfloattest\pgfmathfloattan{1.9636364e+02}{2.9362649e-01}
	\pgfmathfloattest\pgfmathfloattan{2.6181818e+02}{6.9551528e+00}
	\pgfmathfloattest\pgfmathfloattan{3.2727273e+02}{-6.4266098e-01}
	\pgfmathfloattest\pgfmathfloattan{3.9272727e+02}{6.4266098e-01}
	\pgfmathfloattest\pgfmathfloattan{4.5818182e+02}{-6.9551528e+00}
	\pgfmathfloattest\pgfmathfloattan{5.2363636e+02}{-2.9362649e-01}
	\pgfmathfloattest\pgfmathfloattan{5.8909091e+02}{1.1540615e+00}
	\pgfmathfloattest\pgfmathfloattan{6.5454545e+02}{-2.1896946e+00}
	\pgfmathfloattest\pgfmathfloattan{7.2000000e+02}{-4.8985872e-16}



}

{
\testsection{Testing the FPU library (and math parser)}
\pgfkeys{/pgf/fpu}
% #1 : expression
% #2 : the reference
\def\pgfmathfloattest#1#2{%
	\pgfmathfloatparsenumber{#2}%
	\let\reference=\pgfmathresult
	\message{parsing expression #1...}%
	\pgfmathparse{#1}%
	\let\argumenta=\pgfmathresult
	\let\resultfloat=\pgfmathresult
	\pgfmathfloattosci\pgfmathresult
	\let\result=\pgfmathresult
	\pgfmathfloatrelerror\resultfloat\reference
	\pgfmathfloattosci\pgfmathresult
	\[ #1 =  \result \quad[= \resultfloat] \quad (\text{error/r to }#2 = \pgfmathresult)\]
}%
%\tracingmacros=2\tracingcommands=2
	
	\pgfmathfloattest{1+1}{2}
	\pgfmathfloattest{1234567*4}{4938268}
	\pgfmathfloattest{exp(200)}{7.22597376812575e+86}
	\pgfmathfloattest{rad(360)}{6.28318530717959}
	\pgfmathfloattest{rad(180)}{3.14159265358979}
	\pgfmathfloattest{deg(2*pi)}{360}
	\pgfmathfloattest{deg(pi)}{180}
	\pgfmathfloattest{ln(1)}{0}
	\pgfmathfloattest{round(1.5)}{2}
	\pgfmathfloattest{round(-1.5)}{-2}
	\pgfmathfloattest{- (1.5)}{-1.5}
	\pgfmathfloattest{(1e4 - 1e3) * 1e5}{900000000.0}
	\pgfmathfloattest{4^2}{16}
	\pgfmathfloattest{4^3}{64}
	\pgfmathfloattest{4^-3}{0.015625}
	\pgfmathfloattest{4^-6}{0.000244140625}
	\pgfmathfloattest{111^4}{151807041}
	\pgfmathfloattest{8^10}{1073741824}
	\pgfmathfloattest{3^1.5}{5.19615242270663}
	\pgfmathfloattest{16^5.5}{4194304}
	\pgfmathfloattest{15^-0.25}{0.508132748154615}
	\pgfmathfloattest{sec(45)}{1.4142136e+00}
	\pgfmathfloattest{cot(30)}{1.7320508e+00}
	\pgfmathfloattest{asin(7.0710678e-01)}{45}
	\pgfmathfloattest{acos(8.6602540e-01)}{30}
	\pgfmathfloattest{atan(5.7735027e-01)}{30}
	\pgfmathfloattest{atan(16000)}{89.9964}
	\pgfmathfloattest{atan(1e6)}{8.9999943e+01}
	\pgfmathfloattest{atan(-1e6)}{-8.9999943e+01}
	\pgfmathfloattest{-12^2}{-144}%
	\pgfmathfloattest{0-12^2}{-144}%
	\pgfmathfloattest{-(12)^2}{-144}%
	\pgfmathfloattest{exp(-12^2)}{2.8946e-63}%
	\pgfmathfloattest{round(98.8)}{99}%
	\pgfmathfloattest{-pi}{-3.14159265358979}%
	\pgfmathfloattest{2*(-pi)}{-6.28318530717959}%
	\pgfmathfloattest{2*(-3)}{-6}%
	\pgfmathfloattest{veclen(1,1)}{1.414213562373095}%
	\pgfmathfloattest{veclen(1e5,6e5)}{6.082762530298220e+05}%
	\pgfmathfloattest{cosh(5)}{74.20994852478784}%
	\pgfmathfloattest{sinh(0.6)}{0.636653582148241}%
	\pgfmathfloattest{tanh(0.6)}{0.537049566998035}%
%	\pgfmathfloattest{ceil(1.5)}{2}
}
\end{document}
