[Tex/LaTex] Error: “Dimension too large…” when plotting exponentials with TikZ

dimensionserrorsplottikz-pgf

Despite having read answers to 4-5 relate questions, I still can't get why my code does not compile. Here it is:

\documentclass[11pt,twoside]{book}
\usepackage[paperheight=24cm, paperwidth=35cm, margin=0pt, %
voffset=-50cm, hoffset=-1.4cm]{geometry}
\usepackage{tikz}

\usetikzlibrary{calc}

\begin{document}

\pagestyle{empty}

\begin{figure}[!h]
\centering\begin{tikzpicture}[xscale=1,yscale=1]
\draw[very thick,yellow,samples=500,domain=-6*pi:6*pi]
plot (\x, {cos((3*\x r)+pi/2)+\x*sin(3*\x r)});
\draw[very thick,orange,samples=500,domain=-6*pi:6*pi]
plot (\x, {-0.25*(pow(\x,2)*cos(\x r)-\x*sin(\x r))});
\draw[very thick,green,samples=500,domain=-6*pi:6*pi]
plot (\x, {cos(\x r)+\x});
\draw[very thick,magenta,samples=500,domain=-6*pi:6*pi]%%          error!
plot (\x, {0.5*(pow(10,-11)*exp(-3*\x)-cos(\x r)+3*sin(\x r))});%% error!
\draw[very thick,blue,samples=500,domain=-6*pi:6*pi]%%             error!
plot (\x, {pow(10,-15)*exp(3*\x)});%%                              error!
\end{tikzpicture}
\end{figure}

\end{document}

The latest two of five plots – as I showed in comments – are driving me mad.
Please notice the massive voffset too. Is it related?
Obviously I tried several local modifications (e.g. radiants, etc.).
This was just a test but now I'm seriously curious.

Best Answer

Percusse has answered accordingly to the question. (I think his answer should be marked as "accepted", by the way). I took the liberty to propose a MetaPost solution, however.

Until quite recently, this kind of function drawing would have been impossible to do with MetaPost, since it was based only on quite limited fixed-point numerics. But since its version 1.8 the user can switch to floating-point numerics at will, by setting the internal variable numbersystem to double. It's still a bit rough around the edges (the default units has not yet been adapted, for example) but it's quite functional, and I couldn't resist to use it for this problem. The following program makes use of LuaLaTeX and its luamplib package as a very convenient interface to MetaPost. It calls the Metafun format of MetaPost, which defines the necessary auxiliary functions (cos, sin, exp…)

\documentclass[11pt]{standalone}
\usepackage{unicode-math}
\usepackage{luamplib}
  \mplibsetformat{metafun}
  \mplibtextextlabel{enable}
  \mplibnumbersystem{double}
\begin{document}
\begin{mplibcode}
  input mpcolornames;
  % pi, cm (and mm) as accurate as possible 
  %(defaults settings are too inaccurate: pi = 3.14159265, cm = 28.34645)
  pi:= 3.141592653589793; 
  cm := 3600/127; mm := 360/127; 
  % Unit lengths
  u = .5cm; v = mm; 
  % Graphs boundaries
  xmin = -6pi; xmax = -xmin; xsep = (xmax - xmin)/1000; ymin = -80; ymax = 100;
  % Axes settings
  Xmin = -20; Xmax = -Xmin; Ymin = -85; Ymax = 110;
  % Macro building the graph of a given function f
  vardef graph_of_function (suffix f) (expr xmin, xmax, xsep) =
    for x = xmin step xsep until xmax: (x, f(x)) .. endfor (xmax, f(xmax))
  enddef ;
  % Functions to be graphed
  vardef e(expr x) = cos(pi/2 + 3x) + x*sin 3x enddef;
  vardef f(expr x) = -.25(x**2)*cos x - x*sin x enddef;
  vardef g(expr x) = x + cos x enddef;
  vardef h(expr x) = .5(-cos x + 3sin x + 1e-11exp -3x) enddef;
  vardef i(expr x) = 1e-15exp 3x enddef;
  %
  beginfig(0);
    % Drawing of the given functions
    pickup pencircle scaled 1.25bp;
    draw (graph_of_function(e)(xmin, xmax, xsep)) xyscaled (u, v) withcolor yellow;
    draw (graph_of_function(f)(xmin, xmax, xsep)) xyscaled (u, v) withcolor Orange;
    draw (graph_of_function(g)(xmin, xmax, xsep)) xyscaled (u, v) withcolor green;
    draw (graph_of_function(h)(xmin, xmax, xsep)) xyscaled (u, v) withcolor magenta;
    draw (graph_of_function(i)(xmin, xmax, xsep)) xyscaled (u, v) withcolor blue;
    % Clipping
    clip currentpicture to 
      ((xmin, ymin) -- (xmax, ymin) -- (xmax, ymax) -- (xmin, ymax) -- cycle) 
        xyscaled (u, v);
    % Axes and labels
    pickup pencircle scaled .5bp;
    drawarrow (Xmin*u, 0) -- (Xmax*u, 0); drawarrow (0, Ymin*v) -- (0, Ymax*v);
    label.llft("$O$", origin); 
    label.lft("$y$", (0, Ymax*v)); label.bot("$x$", (Xmax*u, 0));
    % Marking…
    labeloffset := 6bp;
    % … on the horizontal axis
    draw (u*pi, -3bp) -- (u*pi, 3bp); draw (-u*pi, -3bp) -- (-u*pi, 3bp);
    label.bot("$\pi$", (pi*u, 0)); label.bot("$-\pi$", (-pi*u, 0));
    for i = 2 upto 6:
      draw (i*pi*u, -3bp)-- (i*pi*u, 3bp); 
      label.bot("$" & decimal i & "\pi$", (i*pi*u, 0));
      draw (-i*pi*u, -3bp)-- (-i*pi*u, 3bp); 
      label.bot("$" & decimal -i & "\pi$", (-i*pi*u, 0));
    endfor;
    % … on the vertical axis
    for i = 20 step 20 until 80:
      label.lft("$" & decimal i & "$", (0, i*v));
      label.lft("$" & decimal -i & "$", (0, -i*v));
      draw (-3bp, i*v) -- (3bp, i*v);
      draw (-3bp, -i*v) -- (3bp, -i*v);
    endfor;
    label.lft("$100$", (0, 100v)); draw (-3bp, 100v) -- (3bp, 100v);
    % Preventing possible cropping of labels at the figure boundaries
    setbounds currentpicture to boundingbox currentpicture enlarged .5cm;
  endfig;
\end{mplibcode}
\end{document}

enter image description here

Related Question