critor wrote:En théorie, cela impliquerait que le fonctionnement interne du moteur utilise non pas une liste de formes prédéfinies, mais des arbres binaires de calculs, soit la base d’un moteur de calcul littéral. Et si en fait…
En fait c'est les deux, il y a bien sur des arbres pour representer les expressions (mais c'etait deja le cas dans la version d'avant sans que personne n'ait pretendu qu'il y avait du calcul litteral dans la Numworks), mais c'est fait par comparaison exacte avec des formes predefinies apres application des regles de simplification "de surface" (qui est le point nouveau de ce firmware). Concernant les lignes trigonometriques, les angles remarquables geres en degres sont 0, 15, 18, 45/2, 30, 36, 45, 54, 60 ,135/2, 72, 75 modulo 90. Le tableau qui gere ca se trouve dans trigonometry.cpp et a un nom bien sympathique
- Code: Select all
constexpr const char * cheatTable[Trigonometry::k_numberOfEntries][5]
(Il est un peu bizarre, au sens ou il liste des angles de -90 a 180).
Mais ca ne marche pas a tous les coups, par exemple asin(sqrt(5/2)/sqrt(5+sqrt(5)) ne renvoie pas pi/5 parce que le moteur de simplification de surface de la Numworks n'est pas capable de le mettre sous la forme exacte du tableau.
Avant d'introduire le calcul exact des lignes trigo du genre pi/5 dans giac (a mon avis peu importantes), je m'etais pas mal inquiete de risquer de rater un asin, acos ou atan particulier, car si on calcule exactement sin/cos/tan, il faut etre capable de calculer la reciproque correspondante.
En reflechissant un peu, j'ai conclu qu'il suffisait de faire le test si l'un des polynomes suivants s'annule sur le carre de l'argument (test numerique avec precision de 1e-9 d'abord puis test exact)
(liste des coefficients des 3 polynomes par ordre decroissant)
(256,-512,336,-80,5)
(512,-1280,1152,-448,70,-3)
(64,-128,80,-16,1)