Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > fr.comp.sys.mac.programmation > #2095

Re: Y a comme un défaut

From pehache <pehache.7@gmail.com>
Newsgroups fr.comp.sys.mac.programmation
Subject Re: Y a comme un défaut
Date 2021-12-04 13:46 +0100
Message-ID <j1168nF58rjU1@mid.individual.net> (permalink)
References <1pjmz6k.1v0nod6mfq0rkN%josephb@nowhere.invalid> <j0vto8FsgsuU1@mid.individual.net> <1pjnmh9.11fmmgjvnnxyuN%josephb@nowhere.invalid>

Show all headers | View raw


Le 04/12/2021 à 10:14, Joseph-B a écrit :
> pehache <pehache.7@gmail.com> wrote:
> 
>> Il n'y a pas forcément de défaut, calculer des restes en arithmétique
>> flottante est forcément casse-gueule quand le résultat de la division
>> est censé être une valeur entière. Quand tu écris "2,54" (ou n'importe
>> quelle autre valeur) la représentation en machine est une approximation
>> de cette valeur, ce n'est pas la valeur exacte (sauf coup de chance).
> 
> Ton argument serait recevable, encore que très dérangeant dans les
> calculs pratiques, pour  (254 mod 25.4) ==> 1.4210854715202E-14

Il n'est pas dérangeant à partir du moment où on a conscience de ce qui 
se passe à bas niveau en machine pour les calculs sur des flottants, et 
qu'on en tient compte quand on écrit du code.

Le truc classique c'est (1+1e-16)-1 dont le résultat est zéro 
exactement, parce que la représentation d'un flottant 64 bits ne peut 
pas différencier (1+1e-16) de 1


> 
> Là où il n'est plus soutenable c'est pour (254 mod 2.54) ==> 2.54

Si, car comme l'a expliqué OM c'est exactement le même problème. Suivant 
que le résultat de la division flottante tombe juste au-dessus ou juste 
au-dessous de la valeur entière à cause des approximations inhérentes au 
calculs en précision limitée, ça va changer le résultat du tout au tout.

Quand tu écris 254/2.54, ce qui se passe en machine c'est
(254+eps1)/(2.54+eps2)
En première approximation (mathématique celle-là) ça donne
100 + (eps1-100*eps2)/2.54

Suivant les valeurs de eps1 et eps2 (qui peuvent être >0 ou <0) le 
résultat peut être juste supérieur ou juste inférieur à 100, et de façon 
non prédictible (*). Donc en prenant la partie entière ça va donner 100 
ou 99. Si c'est un problème il faut que tu écrives ton code différemment.

(*) mais quand même reproductible :)... Du moins tant qu'on ne change 
pas de machine.

> 
> Si le copro-arithmétique du Mac n'a pas été écrit pour retourner la
> valeur correcte (± epsilon d'après ton argument) de la FONCTION "RESTE"
> d'une divison, il y a un GROS SOUCI !!

Je ne suis pas certain qu'il existe une telle fonction câblée en 
hardware dans le processeur pour les flottants. Elle doit être logicielle.

> Pour preuve, toujours dans l'éditeur de script si j'essaie cette fois en
> javascript
> 
> 254 % 2.54 ==> 2.5399999999999965
> ou
> 7412 % 74.12 ==> 74.11999999999955
> 
> résultats totalement inacceptables, et je ne me satisfais pas vraiment
> que
> 7412 % 7.412 ==> 7.815970093361102e-14
> tende vers zéro
> 
> d'ailleurs, voici en dessous une fonction Modulo() écrite en
> AppleScript, qui fort heureusement retourne "ZÉRO" comme reste de  (par
> exemple…)
> 254 par 2.54 ou
> 789452.18 par 789.45218
> ou toutes autres valeurs du domaine de précison du copro.
> 
> on Modulo(dividende, diviseur)
>     set partieEntiere to (dividende div diviseur)
>     set reste to (dividende - (partieEntiere * diviseur))
>     return reste
> end Modulo
> 

Dans ce cas utilise cette fonction écrite par tes soins si tu estimes 
qu'elle se comporte mieux que la fonction proposée par le langage. Ceci 
étant ça reste de l'arithmétique flottante, et *rien* ne peut garantir 
que le résultat sera *toujours* conforme à ce que tu attends.

Comme l'a dit OM la seule façon de garantir le résultat que tu attends 
est de passer en arithmétique entière.

-- 
"...[la moto] un engin qui par les lois de la physique ne peut pas
freiner en courbe.", SLD sur fr.rec.bricolage
"...sois ouvert aux idées des autres pour peu qu'elles aillent dans le
même sens que les tiennes.", ST sur fr.bio.medecine

Back to fr.comp.sys.mac.programmation | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

Y a comme un défaut josephb@nowhere.invalid (Joseph-B) - 2021-12-04 00:54 +0100
  Re: Y a comme un défaut pehache <pehache.7@gmail.com> - 2021-12-04 02:14 +0100
    Re: Y a comme un défaut josephb@nowhere.invalid (Joseph-B) - 2021-12-04 10:14 +0100
      Re: Y a comme un défaut Olivier Miakinen <om+news@miakinen.net> - 2021-12-04 12:48 +0100
        Re: Y a comme un défaut josephb@nowhere.invalid (Joseph-B) - 2021-12-04 13:16 +0100
          Re: Y a comme un défaut Olivier Miakinen <om+news@miakinen.net> - 2021-12-04 13:23 +0100
            Calculette IEEE754 (was: Y a comme un défaut) Olivier Miakinen <om+news@miakinen.net> - 2021-12-04 14:39 +0100
      Re: Y a comme un défaut pehache <pehache.7@gmail.com> - 2021-12-04 13:46 +0100
        Re: Y a comme un défaut josephb@nowhere.invalid (Joseph-B) - 2021-12-04 15:25 +0100
          Re: Y a comme un défaut "M.V." <mv@gmail.com.invalid> - 2021-12-04 14:49 +0000
            Re: Y a comme un défaut josephb@nowhere.invalid (Joseph-B) - 2021-12-04 19:21 +0100
              Re: Y a comme un défaut "M.V." <mv@gmail.com.invalid> - 2021-12-04 18:58 +0000
          Re: Y a comme un défaut Benoit <benoit@com.invalid> - 2021-12-04 16:35 +0000
          Re: Y a comme un défaut pehache <pehache.7@gmail.com> - 2021-12-04 17:39 +0100
            Re: Y a comme un défaut josephb@nowhere.invalid (Joseph-B) - 2021-12-04 19:21 +0100
              Re: Y a comme un défaut pehache <pehache.7@gmail.com> - 2021-12-04 20:28 +0100
              Re: Y a comme un défaut JPP <jpp@findelmundo.invalid> - 2021-12-05 03:24 -0300
      Re: Y a comme un défaut Julien Salort <listes@salort.eu> - 2021-12-05 09:51 +0100
  Re: Y a comme un défaut Fleuger <g4fleurot@free.fr.invalid> - 2021-12-04 08:27 +0000
    Re: Y a comme un défaut Fleuger <g4fleurot@free.fr.invalid> - 2021-12-04 09:00 +0000
      Re: Y a comme un défaut "M.V." <mv@gmail.com.invalid> - 2021-12-04 09:25 +0000
        Re: Y a comme un défaut Fleuger <g4fleurot@free.fr.invalid> - 2021-12-04 13:01 +0000
          Re: Y a comme un défaut "M.V." <mv@gmail.com.invalid> - 2021-12-04 14:27 +0000
    Re: Y a comme un défaut josephb@nowhere.invalid (Joseph-B) - 2021-12-04 10:14 +0100
      Re: Y a comme un défaut "M.V." <mv@gmail.com.invalid> - 2021-12-04 09:30 +0000
        Re: Y a comme un défaut josephb@nowhere.invalid (Joseph-B) - 2021-12-04 12:57 +0100
          Re: Y a comme un défaut pehache <pehache.7@gmail.com> - 2021-12-04 14:16 +0100
          Re: Y a comme un défaut "M.V." <mv@gmail.com.invalid> - 2021-12-04 14:18 +0000
      Re: Y a comme un défaut "M.V." <mv@gmail.com.invalid> - 2021-12-04 10:30 +0000
  Re: Y a comme un défaut "M.V." <mv@gmail.com.invalid> - 2021-12-04 08:45 +0000
  Re: Y a comme un défaut JPP <jpp@findelmundo.invalid> - 2021-12-04 14:16 -0300
  Re: Y a comme un défaut "Néo, l'Élu" <neo-de-matrix@meta-science.fr> - 2022-02-07 10:56 +0000

csiph-web