Seite 1 von 1

Rechnen mit pgf, Ergebnis "zu" ungenau

Verfasst: Mo 16. Sep 2013, 12:10
von StefanB
Hallo,

ich versuche gerade mir mit pgf ein kleines Makro zu schreiben, dass mir einen Notenschlüssel abhängig von max. Punktzahl und gewählten "Prozentschritt" erstellt und das ganze in eine Tabelle schreibt...

Das Problem ist das Runden auf die 0.5.

Aber zunächst stehe ich vor dem Problem, dass pgf "unsauber" rechnet. Ich habe folgendes definiert:
\documentclass{article}
\usepackage{pgf}

\begin{document}

\def\myarraynote{{0.85,0.7,0.55,0.45,0.35,0.3}}
\foreach \i in {0,1,2,3,4,5} 
{ \pgfmathparse{{multiply(20,\myarraynote[\i]}} \pgfmathresult \\}
\end{document}


Die erste Rechnung: 20*0.85=17, also wirklich 17. pgf berechnet aber 17.00012

Wieso?

Oder bin ich da auf einem falschen Weg und könnte das ganze einfacher realieren?

Verfasst: Mo 16. Sep 2013, 16:20
von esdd
TeX rechnet wirklich nicht so genau, weshalb es zu Rundungsfehlern kommen kann. Etwas genauer als pgfmath ist fp:
\documentclass[parskip=full-]{scrartcl} 
\usepackage{pgffor}
\usepackage{pgfmath}
\usepackage{fp}

\begin{document} 

\def\myarraynote{{0.85,0.7,0.55,0.45,0.35,0.3}}

Mit pgfmath:
\foreach \i in {0,...,5} 
  {\\ \pgfmathparse{multiply(20,\myarraynote[\i]} \pgfmathresult} 

\vspace{1cm}
Mit fp:
\foreach [evaluate=\i as \j using {\myarraynote[\i]}] \i in {0,...,5} 
  {\\ \FPeval\resultfp{\j*20} \resultfp}

\end{document}
Gruß
Elke

Verfasst: Mo 16. Sep 2013, 18:03
von StefanB
OK, danke. Ich schau mir das mal an.

Wobei ich eh am Überlegen, die Rechnung von ExcelCalc durchführen zu lassen...Ich will eh Daten von Calc nach TeX exportieren, und dann kann ich die Rechenergebnisse auch gleich mitexportieren...

Verfasst: Di 17. Sep 2013, 10:56
von sudo
So schlimm ungenau sind die Ergebnisse ja gar nicht, man muss halt nur die Rechengenauigkeit von TeX beachten und entsprechend runden. Das kann man zum Beispiel mit \pgfmathprintnumber:
\documentclass{article} 
\usepackage{pgf} 
\usepackage{pgffor}

\begin{document}
\noindent
\def\myarraynote{{0.85,0.7,0.55,0.45,0.35,0.3}}%
\foreach \i in {0,1,2,3,4,5}{\pgfmathparse{multiply(20,\myarraynote[\i])}\pgfmathprintnumber[precision=3]{\pgfmathresult}\\} 
\end{document}
PS: Ich brauchte noch pgffor um das Beispiel zum laufen zu bringen. Ist das bei euch anders?

Verfasst: Di 17. Sep 2013, 12:47
von esdd
sudo hat geschrieben:PS: Ich brauchte noch pgffor um das Beispiel zum laufen zu bringen. Ist das bei euch anders?
Bei mir ist es ebenfalls so, dass pgffor nicht automatisch von pgf geladen wird.