
Ich verwende ein Makro vonHier(Dank anSchrödingers Katze). Siehe mein 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}
Gibt:
- 4,414001000000000
- 3,483002000000000
- 3,652002000000000
- 2,221002000000000
- 0,990002
- 0,159003
- -0,571997
- -1,302997000000000
- -1,033997000000000
- -0,064996
- 1,304004000000000
Wenn ich dasselbe beispielsweise mit MATLAB mache:
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
Dann bekomme ich folgendes:
- 4,261621e+00.
- 3,290914e+00.
- 3,388431e+00.
- 2.098301e+00.
- 9.151911e-01.
- 5.300458e-02.
- -7,017887e-01.
- -1,456052e+00.
- -1,139024e+00.
- -2,840543e-01.
- 1,217927e+00.
Der Unterschied ist gewaltig.
Warum ist das so? Irgendwelche Vorschläge, wie man das Problem lösen kann fpu
, wenn es überhaupt möglich ist?
Vielen Dank im Voraus für Ihre Hilfe und Mühe!
Antwort1
Das PGF-FließkommamodulIstungenau, da es TeX-Arithmetik verwendet und daher nicht über fünf Dezimalstellen hinausgeht. Es ist nicht als Allzweck-Werkzeug für Gleitkomma-Arithmetik gedacht, sondern nur für den Schriftsatz.
Verwenden 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}
Antwort2
Du kannst es versuchenfp,xfp(siehe egregs Antwort) oderlua
1)Update: Version mit 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}
2) alte Version mit 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}
Antwort3
Eine Implementierung mit dem CASSage (Mathe)UndSageTeX:
ich benutzearara: sagetexzum Kompilieren.
% 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}