Code : Tout sélectionner
17.64-15.84;
Code : Tout sélectionner
1.800000000000001
Code : Tout sélectionner
17.64-15.84;
Code : Tout sélectionner
1.800000000000001
Il me faudrait des détails sur l'algorithme utilisé pour effectuer une soustraction (de nombres décimaux) mais je me demande bien pourquoi il a besoin de faire des arrondis. D'autant que le nombre de décimales de ces décimaux est bien faible (bien inférieur au digit limite de Maxima en tout cas).Arnaud a écrit :Erreur d'arrondis à mon avis.
AMHA les calculs en interne sont en binaire. La perte de précision se fait à cause de la conversion décimal->binaire qui en général n'est pas exacte.MB a écrit :Il me faudrait des détails sur l'algorithme utilisé pour effectuer une soustraction (de nombres décimaux) mais je me demande bien pourquoi il a besoin de faire des arrondis. D'autant que le nombre de décimales de ces décimaux est bien faible (bien inférieur au digit limite de Maxima en tout cas).Arnaud a écrit :Erreur d'arrondis à mon avis.
De toute façon il y a bien un problème quelque part c'est sûr.gigiair a écrit :AMHA les calculs en interne sont en binaire. La perte de précision se fait à cause de la conversion décimal->binaire qui en général n'est pas exacte.
Code : Tout sélectionner
7.64-5.84;
Code : Tout sélectionner
1.8
Code : Tout sélectionner
8.64-6.84;
Code : Tout sélectionner
1.800000000000001
Code : Tout sélectionner
float(864/100-684/100);
Code : Tout sélectionner
1.8
Oui, tout à fait;Il est un peu illogique de demander à un calculateur symbolique de calculer en virgule flottante, puisque par définition ce calcul est approché.
Maxima est programmé en clisp.MB a écrit :Pour une explication détaillée de la méthode d'addition (et de soustraction) en virgule flottante, cette page est bien faite.
En effet, c'est tout à fait approximatif, même pour des nombres qui ne nécessiteraient pas un arrondi.
D'après ce site, on devrait trouver $8.64-6.84=1.8000002$ et $7.64-5.84=1.7999997$.
Code : Tout sélectionner
to_lisp() ;
Code : Tout sélectionner
(to-maxima)
Apparemment le type LONG-FLOAT est assez similaire. Je trouve ici :gigiair a écrit :le clisp de maxima a un type supplémentaire : bigfloat, flottants dont la précision est fixée par la valeur de fpprec
Donc à part ça, une DOUBLE-FLOAT semble codé sur 64 bits : 1 (signe) + 52 (mantisse) + 11 (exposant). (voir ici pour la norme IEEE-754 que semble respecter Lisp (à peu près)).Arbitrary Precision Floats. LONG-FLOATs have variable mantissa length, which is a multiple of 16 (or 32, depending on the word size of the processor). The default length used when LONG-FLOATs are READ is given by the place (EXT:LONG-FLOAT-DIGITS). It can be set by (SETF (EXT:LONG-FLOAT-DIGITS) n), where n is a positive INTEGER. E.g., (SETF (EXT:LONG-FLOAT-DIGITS) 3322) sets the default precision of LONG-FLOATs to about 1000 decimal digits.
Source : Wikipédia.In describing binary floating-point types, the significand is characterized by a certain width in bits (binary digits). Because the most significant bit is always 1 for normal numbers, this bit is typically not stored and is called the "hidden bit". Depending on the context, the hidden bit may or may not be counted in describing the width of the significand. For example, the same IEEE 754 double precision format is commonly described either as having a 53-bit significand/mantissa (including the hidden bit) or as having a 52-bit significand/mantissa (not including the hidden bit).
Code : Tout sélectionner
0.625 × 2 = 1.25 1
0.25 × 2 = 0.5 0
0.5 × 2 = 1.0 1