TikZ fpu parece ser inexacto

TikZ fpu parece ser inexacto

Estoy usando una macro deaquí(gracias aEl gato de Schrödinger). Ver mi MWE:

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{fpu}
\newcommand\pgfmathparseFPU[1]{
                               \begingroup
                                 \pgfkeys{
                                          /pgf/fpu,
                                          /pgf/fpu/output format = fixed
                                         }
                                 \pgfmathparse{#1}
                                 \pgfmathsmuggle
                                 \pgfmathresult
                               \endgroup}

\begin{document}

  %data values:
  \def\UABmValues{{14.9, 15.8, 17.7, 18.3, 19, 20, 21.1, 22.2, 24.3, 26.9, 30.1}}

  %prints the result to the console:
  \foreach[count = \i from 0] \k in {30, 35, ..., 80}
    {
     \pgfmathsetmacro{\UABmValues}{\UABmValues[\i]}
     \pgfmathparseFPU{-25500 / (\UABmValues / 1000 - 255 / 52) - 5200 - 3.0897 / 8 * \k}\i, \pgfmathresult\\
    }

\end{document}

Da:

  1. 4.414001000000000
  2. 3.483002000000000
  3. 3.652002000000000
  4. 2.221002000000000
  5. 0.990002
  6. 0.159003
  7. -0.571997
  8. -1.302997000000000
  9. -1.033997000000000
  10. -0.064996
  11. 1.304004000000000

Cuando hago lo mismo, digamos, con MATLAB:

    UABmValues = [14.9 15.8 17.7 18.3 19 20 21.1 22.2 24.3 26.9 30.1];
    R = 30 : 5 : 80;

    %prints the result to the console:
    for j = 1 : 11

      result = -25500 / (UABmValues(j) / 1000 - 255 / 52) - 5200 - 3.0897 / 8 * R(j);
      fprintf('j=%d, ', j)
      fprintf('%d.\n', result)

    end

De lo que obtengo lo siguiente:

  1. 4.261621e+00.
  2. 3.290914e+00.
  3. 3.388431e+00.
  4. 2.098301e+00.
  5. 9.151911e-01.
  6. 5.300458e-02.
  7. -7.017887e-01.
  8. -1.456052e+00.
  9. -1.139024e+00.
  10. -2.840543e-01.
  11. 1.217927e+00.

La diferencia es enorme.

¿Por que es esto entonces? ¿Alguna sugerencia de cómo solucionarlo fpu, si al menos es posible?

¡Gracias por su ayuda y esfuerzo de antemano!

Respuesta1

El módulo de punto flotante PGFesinexacto, ya que utiliza aritmética TeX, por lo que no supera los cinco dígitos decimales. No pretende ser una herramienta aritmética de coma flotante multiuso, sino sólo para componer tipos.

Usar xfp.

\documentclass{article}
\usepackage{tikz}
\usepackage{xfp}

\begin{document}

%data values:
\def\UABmValues{{14.9, 15.8, 17.7, 18.3, 19, 20, 21.1, 22.2, 24.3, 26.9, 30.1}}

%prints the result to the console:
\foreach[count = \i from 0] \k in {30, 35, ..., 80}
  {
   \pgfmathsetmacro{\UABmValues}{\UABmValues[\i]}
   \i, $\fpeval{-25500 / (\UABmValues / 1000 - 255 / 52) - 5200 - 3.0897 / 8 * \k}$\par
  }

\end{document}

ingrese la descripción de la imagen aquí

Respuesta2

Puedes probarfp,xfp(ver la respuesta de egreg) olua

1)actualización: versión con lua

% !TEX TS-program = lualatex

\documentclass{scrartcl}
\usepackage{pgffor,pgfmath}
\def\luafun#1#2{
    \directlua{
        x = #1;
        y = #2;
       r=-25500/(x/1000-255/52)-5200-3.0897/8*y
       tex.print(r)}
} 

\begin{document}
\def\UABmValues{{14.9, 15.8, 17.7, 18.3, 19, 20, 21.1, 22.2, 24.3, 26.9, 30.1}}

\foreach[count = \i from 0] \k in {30, 35, ..., 80}
{
\pgfmathsetmacro{\myval}{\UABmValues[\i]}%
\luafun{\myval}{\k}\par
 }

\end{document}

ingrese la descripción de la imagen aquí

2) versión antigua con fp

\documentclass{scrartcl}
\usepackage{tikz,fp}
\newcommand\pgfmathparseFP[1]{
   \begingroup
        \FPeval\pgfmathresult{(#1)}
     \pgfmathsmuggle
     \pgfmathresult
   \endgroup
    }

\begin{document}

  %data values:
\def\UABmValues{{14.9, 15.8, 17.7, 18.3, 19, 20, 21.1, 22.2, 24.3, 26.9, 30.1}}

%prints the result to the console:
\foreach[count = \i from 0] \k in {30, 35, ..., 80}
{
\pgfmathsetmacro{\myval}{\UABmValues[\i]}%
\pgfmathparseFP{-25500/(\myval/1000-255/52)-5200-3.0897/8*\k}\i, \pgfmathresult\par
 }

\end{document}

ingrese la descripción de la imagen aquí

Respuesta3

Una implementación con el CASsabio (matemáticas)ySageTeX:

ingrese la descripción de la imagen aquí

yo sueloarara: sagetexpara compilar.

% arara: pdflatex
% arara: sagetex
% arara: pdflatex

\documentclass{scrartcl}
\usepackage{sagetex, amsmath}
\usepackage{tikz}
\usetikzlibrary{fpu}
\newcommand\pgfmathparseFPU[1]{
\begingroup
\pgfkeys{
 /pgf/fpu,
/pgf/fpu/output format = fixed
}
\pgfmathparse{#1}
\pgfmathsmuggle
\pgfmathresult
\endgroup}

\begin{document}
%data values:
\def\UABmValues{{14.9, 15.8, 17.7, 18.3, 19, 20, 21.1, 22.2, 24.3, 26.9, 30.1}}

\section{pgfmath}
\foreach[count = \i from 0] \k in {30, 35, ..., 80}
{
\pgfmathsetmacro{\UABmValues}{\UABmValues[\i]}
\pgfmathparseFPU{-25500 / (\UABmValues / 1000 - 255 / 52) - 5200 - 3.0897 / 8 * \k}\noindent\i, \UABmValues, \pgfmathresult \\
}

\section{SageTeX}
\subsection{Sage-Output}
$\sagestr{MyOut}$

\subsection{From sageblock or sagesilent}
\begin{sageblock}
Val = ([14.9, 15.8, 17.7, 18.3, 19, 20, 21.1, 22.2, 24.3, 26.9, 30.1])
## Test:
#print Val[1]
#print len(Val)

# Function
f(x,y) = -25500/(x/1000 - 255/52) -5200 -3.0897/8 *(30+5*y)

# Short Output
#for i in range (len(Val)): print i,',',float(Val[i]),',', f(Val[i],i)

# Better Output    
data = [(i,  float(Val[i]), f(Val[i],i)) for i in range(len(Val))] 
data_str = [',   '.join(map(str, t)) for t in data] 
data_str = '\n'.join(data_str) 

MyOut = latex(data_str)
#print data_str
\end{sageblock}
\end{document}

información relacionada