tag:linuxfr.org,2005:/tags/q/publicLinuxFr.org : les contenus étiquetés avec « q »2017-10-01T10:46:38+02:00/favicon.pngtag:linuxfr.org,2005:Diary/375122017-09-28T16:27:38+02:002017-09-28T16:27:38+02:00Calculs numériques en précision absolue.Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#introduction">Introduction</a></li>
<li>
<a href="#les-expressions">Les expressions</a><ul>
<li><a href="#formats">Formats</a></li>
<li><a href="#notation-alg%C3%A9brique">Notation algébrique</a></li>
<li><a href="#notation-rpn">Notation <em>RPN</em></a></li>
</ul>
</li>
<li>
<a href="#installation-et-utilisation">Installation et utilisation</a><ul>
<li><a href="#g%C3%A9n%C3%A9ralit%C3%A9s">Généralités</a></li>
<li><a href="#nodejs"><em>Node.js</em></a></li>
<li><a href="#jre-java"><em>JRE</em> (<em>Java</em>).</a></li>
<li><a href="#ligne-de-commande">Ligne de commande</a></li>
</ul>
</li>
<li><a href="#%C3%89volution">Évolution</a></li>
</ul><h2 id="introduction">Introduction</h2>
<p>La lecture de ce <a href="//linuxfr.org/users/niconico/journaux/sql-decimal-vs-double">journal</a> m'a remémoré une bibliothèque de calcul numérique que j'ai développée et qui pourrait peut-être en intéresser quelques-uns ici.</p>
<p>J'ai rarement utilisé les nombres flottants à cause de leur précision limitée, et les entiers se sont parfois révélés inadaptés de par leur intervalles limités. Aussi ai-je développé une bibliothèque de gestion d'entiers dynamiques, et, en m'appuyant sur cette dernière, une bibliothèque de gestion de nombres rationnels qui prend en charge les 4 opérations mathématiques de base avec une précision absolue.</p>
<p>Les logiciels que je présente ici ne sont, pour l'instant, que capable de calculer le résultat d'une chaîne de caractères contenant une expression numérique. Ce calcul peut se réaliser à l'aide d'un utilitaire en ligne de commande, d'un <em>addon</em> <em>Node.js</em>, ou d'un composant <em>Java</em>.</p>
<p>Il est possible d'essayer cette bibliothèque en ligne, pour peu que l'on ai quelques rudiments en <em>Javascript</em> et le navigateur adéquat, en se rendant à cette adresse : <a href="http://q37.info/runkit/rncq/">http://npm.runkit.com/rncq/</a>.</p>
<p>L'expression à évaluer peut être algébrique (<code>1 + 2 / 3</code>) ou <em><a href="http://q37.info/s/x/RPN_fr/">RPN</a></em> (<code>1 2 + 3 /</code>). La version en ligne de commande propose en outre deux options :</p>
<ul>
<li>
<code>--to-float</code> qui convertit le résultat final en <em>float</em>,</li>
<li>
<code>--use-float</code> qui réalise le calcul à l'aide du type <em>float</em>.</li>
</ul><p>La mise en œuvre d'une de ces deux options peut avoir des résultats inattendus, de par la précision limité du type <em>float</em>, mais aussi parce que les calculs peuvent aboutir à des nombres qui dépassent largement les capacités du type <em>float</em>. </p>
<h2 id="les-expressions">Les expressions</h2>
<h3 id="formats">Formats</h3>
<p>Une expression peut être exprimée au format algébrique (<code>1 + 2 * 3</code>) ou <em>RPN</em> (<code>1 2 3 * +</code>). Elle peut contenir un nombre décimal (le séparateur est <code>.</code> ou <code>,</code>), auquel cas il est convertit en sa fraction équivalente. Par exemple, <code>12.345</code> est convertit en <code>2469/200</code> (qui est égal à <code>12345/1000</code>).</p>
<p>Les opérateurs reconnus sont :</p>
<ul>
<li>
<code>+</code> pour l'addition,</li>
<li>
<code>-</code> pour la soustraction,</li>
<li>
<code>*</code>, <code>x</code>et <code>X</code> pour la multiplication,</li>
<li>
<code>/</code> et <code>:</code> pour la division.</li>
</ul><p>Lorsque l'expression à évaluer est un argument de ligne de commande, il faut prendre garde aux opérateurs utilisés. Par exemple, l'opérateur de multiplication usuel (<code>*</code>) peut poser problème sous système <em>POSIX</em>, car l'interpréteur le remplace par une liste de fichiers ; il faut donc l'échapper (<code>\*</code>), mettre l'expression entre guillemets ou utiliser l'un des symboles alternatifs (<code>x</code>ou <code>X</code>). De la même manière, si l'expression contient des espaces, il faut mettre toute l'expression entre guillemets, pour qu'elle soit comprise par le programme comme un seul est unique argument. </p>
<h3 id="notation-algébrique">Notation algébrique</h3>
<p>C'est la notation usuelle, à savoir, par exemple, <code>1 + 2 * 3</code>.</p>
<p>Les parenthèses ne sont actuellement pas reconnues, et la priorité des opérateurs n'est pas prise en compte (<code>1+2*3</code> donne <code>9</code>, et non pas <code>7</code>).</p>
<p>les <code>-</code> et <code>+</code>unaires sont, eux, reconnus.</p>
<h3 id="notation-rpn">Notation <em>RPN</em>
</h3>
<p>C'est la notation dans laquelle on donne d'abord les arguments d'une opération avant de préciser l'opérateur qui doit être appliqué. Ainsi, l'équivalent de l'expression algébrique <code>(1 + 2) * 3</code> sera <code>1 2 + 3 *</code>(on voit que le format <em>RPN</em> permet de se passer de parenthèses).</p>
<p>Le <code>-</code> unaire n'est actuellement pas implémenté, aussi, pour entrer un nombre négatif, il convient d'écrire <code>0 <nombre> -</code>. </p>
<h2 id="installation-et-utilisation">Installation et utilisation</h2>
<h3 id="généralités">Généralités</h3>
<p>Mis à part sous <em>Windows</em>, il faut qu'un environnement de compilation <em>C++</em> soit installé.</p>
<p>Les différents paquets sont compilés :</p>
<ul>
<li>sous environnement <em>POSIX</em> (y compris <em>macOS</em> et <em>Cygwin</em>), en lançant la commande <code>make</code> à la racine du <em>package</em>,</li>
<li>sous <em>Windows</em>,
<ul>
<li>en lançant la compilation du <code>.vcxproj</code> dans <em>Visual Studio</em>,</li>
<li>sous <em>Cygwin</em>, voir ci-dessus (environnement <em>POSIX</em>) , sachant que :
<ul>
<li>par défaut, le binaire produit utilisera l'<em>API</em> <em>Cygwin</em>,</li>
<li>en passant l'argument <code>target=win</code> (voire <code>target=win32</code> ou <code>target=win64</code> pour produire explicitement une version <em>IA-32</em> ou <em>AMD64</em> du binaire), si la version adéquate de <em>mingw</em> est installée, on obtient un binaire utilisant l'<em>API</em> Windows.</li>
</ul>
</li>
</ul>
</li>
</ul><p>À noter que les binaires <em>Windows</em> d'un paquet sont directement disponibles dans la section <em>releases</em> du <em>repository</em> <em>GitHub</em> dudit paquet. </p>
<p>Si le paquet est directement lié à un <em>framework</em> tiers, il est possible que le <em>framewok</em> en question impose la manière dont le paquet doit être compilé. Il faudra alors voir la documentation dudit <em>framework</em>. </p>
<h3 id="nodejs"><em>Node.js</em></h3>
<p><em>GitHub</em> : <a href="http://q37.info/github/rncq-node">http://github.com/epeios-q37/rncq-node</a></p>
<p><a href="https://nodei.co/npm/rncq/"><img src="//img.linuxfr.org/img/68747470733a2f2f6e6f6465692e636f2f6e706d2f726e63712e706e67/rncq.png" alt="NPM" title="Source : https://nodei.co/npm/rncq.png"></a></p>
<p>Le composant étant disponible sur <em>NPM</em>, il suffit de lancer <code>npm install rncq</code>. Excepté sous <em>Windows</em>, il faut qu'un environnement de compilation <em>C++</em> soit installé.</p>
<p>Une fois installé, on peut lancer un test avec <code>npm explore rncq -- node test.js</code>, avec éventuellement, comme argument, une expression à évaluer. Par défaut, cette expression doit être en notation algébrique, mais en modifiant le fichier <code>node_modules/rncq/test.js</code>, on peut basculer en notation <em>RPN</em> (voir les commentaires dans le fichier en question).</p>
<p>Pour rappel, la version <em>Node.js</em> peut être testée en ligne sur <em>Runkit</em> (<a href="http://q37.info/runkit/rncq/">http://npm.runkit.com/rncq/</a>).</p>
<h3 id="jre-java">
<em>JRE</em> (<em>Java</em>).</h3>
<p><em>GitHub</em> : <a href="http://q37.info/github/rncq-java">http://github.com/epeios-q37/rncq-java</a></p>
<p>il faut au préalable récupérer le <a href="http://q37.info/github/jreq/"><em>wrapper</em> <em>Java</em></a>, et lancer la compilation comme indiqué ci-dessus. Il faut que le <em>Java Development Kit</em> soit installé. Une fois le binaire compilé, il faudra le placer, ainsi que les fichiers <code>jreq.xcfg</code>et <code>jreq.xlcl</code>, à la racine du paquet <em>rncq-java</em> (les fichiers <code>.java</code> et <code>.class</code> ne sont pas nécessaires).</p>
<p>Une fois le paquet <em>rncq-java</em> compilé (et les fichiers du <em>wrapper</em> mis en place), on peut lancer un test avec <code>java RNCqTest</code>, et éventuellement passer une expression numérique comme argument. On peut basculer en mode <em>RPN</em> en modifiant le fichier (qu'il faudra alors recompiler) <code>RNCq.java</code> (voir les commentaires dans ce fichier).</p>
<h3 id="ligne-de-commande">Ligne de commande</h3>
<p><em>GitHub</em> : <a href="http://q37.info/github/rncq-cli">http://github.com/epeios-q37/rncq-cli</a></p>
<p>Après compilation (voir ci-dessus), il suffit de lancer <code>rncq</code> avec l'expression numérique à évaluer.</p>
<p>Par défaut, l'expression doit être au format algébrique, mais avec l'option <code>--rpn</code>, on peut saisir une expression au format <em>RPN</em>. <code>rncq --help</code> permet d'afficher la liste des option disponibles.</p>
<h2 id="Évolution">Évolution</h2>
<p>Je projette, pour les prochaines versions, d'exposer, afin de pouvoir y accéder directement, les différentes fonctions permettant de réaliser les calculs. Ceci dit, pour <em>Node.js</em>, je ne vois pas encore trop à quoi devrait ressembler l'<em>API</em> pour qu'elle soit non bloquante (s'il y en a qui ont des idées à ce propos…).</p>
<p>Il est également possible que je développe une version pour <em>PHP</em>, voire d'autres environnements d'exécution.</p>
<p>Je voudrais également améliorer le procédure d'installation, notamment pour la version <em>Java</em>, mais il n'existe (ou je n'ai pas trouvé) l'équivalent de <em>NPM</em> pour <em>Java</em>, donc je ne sais, pour l'instant, pas encore comment faire.</p><div><a href="https://linuxfr.org/users/epeios/journaux/calculs-numeriques-en-precision-absolue.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/112769/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/epeios/journaux/calculs-numeriques-en-precision-absolue#comments">ouvrir dans le navigateur</a>
</p>
Claude SIMONhttps://linuxfr.org/nodes/112769/comments.atom