Y a comme un défaut

21 réponses
Avatar
josephb
Bonjour,

Sauf erreur de ma part, je viens de faire une découverte déstabilisante.
Des volontaires pour exécuter le petit script que je vous mets en dessous ?
Après le premier test avec la valeur 2.54 pour diviseur
refaites l'essai avec 25.4
Dites-moi si des résultats obtenus chez vous sont conformes ou délirants ?
Je ne me rappelle pas avoir jamais rencontré cette "anomalie" depuis que je tripote appleScript*.
Le bug provient-il de El Cap ou se perpétue-t-il encore ?
* Ce qui ne veut pas dire qu'elle n'était pas déjÍ  lÍ  ?

*******************
set diviseur to 2.54
set serie to {0.254, 2.54, 25.4, 254, 2540}
set restes to {}
set text item delimiters to " - "
set commentaire to "Restes de la division par " & (diviseur as text) & " de" & linefeed & (serie as string)

repeat with value in serie
copy (value mod diviseur) to the end of restes
end repeat
display alert (restes's every item as text) message commentaire

*********************

AppleScript operator Description
mod Remainder.
A binary arithmetic operator that divides the number to its left by the number to its right and returns the remainder as its
result.
Class of operands: integer, real Class of result: integer, real

*********************
pour info, avec 2,54 j'obtiens
0,254 - 0,0 - 2,54 - 2,54 - 2,54

et avec 25,4
0,254 - 2,54 - 0,0 - 1,42108547152E-14 - 1,42108547152E-13

--
J. B.

10 réponses

1 2 3
Avatar
pehache
Le 04/12/2021 Í  00:54, Joseph-B a écrit :
Bonjour,
Sauf erreur de ma part, je viens de faire une découverte déstabilisante.
Des volontaires pour exécuter le petit script que je vous mets en dessous ?
Après le premier test avec la valeur 2.54 pour diviseur
refaites l'essai avec 25.4
Dites-moi si des résultats obtenus chez vous sont conformes ou délirants ?
Je ne me rappelle pas avoir jamais rencontré cette "anomalie" depuis que je tripote appleScript*.
Le bug provient-il de El Cap ou se perpétue-t-il encore ?
* Ce qui ne veut pas dire qu'elle n'était pas déjÍ  lÍ  ?
*******************
set diviseur to 2.54
set serie to {0.254, 2.54, 25.4, 254, 2540}
set restes to {}
set text item delimiters to " - "
set commentaire to "Restes de la division par " & (diviseur as text) & " de" & linefeed & (serie as string)
repeat with value in serie
copy (value mod diviseur) to the end of restes
end repeat
display alert (restes's every item as text) message commentaire
*********************
AppleScript operator Description
mod Remainder.
A binary arithmetic operator that divides the number to its left by the number to its right and returns the remainder as its
result.
Class of operands: integer, real Class of result: integer, real
*********************
pour info, avec 2,54 j'obtiens
0,254 - 0,0 - 2,54 - 2,54 - 2,54
et avec 25,4
0,254 - 2,54 - 0,0 - 1,42108547152E-14 - 1,42108547152E-13

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).
--
"...[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
Avatar
Fleuger
Le 4 décembre 2021 Í  00:54, Joseph-B a écrit ceci :
pour info, avec 2,54 j'obtiens
0,254 - 0,0 - 2,54 - 2,54 - 2,54
et avec 25,4
0,254 - 2,54 - 0,0 - 1,42108547152E-14 - 1,42108547152E-13

Bonjour Joseph,
Mojave,
Restes de la division par 2,54
0,254 - 0,0 - 2,54 - 2,54 - 2,54
Restes de la division par 25,4
0,254 - 2,54 - 0,0 - 1,42108547152E-14 - 1,42108547152E-13
Le défaut provient du Système
Même calcul avec Excel :
Nombre 0,254 2,54 25,4 254 2540
Diviseur 2,54 2,54 2,54 2,54 2,54
Reste 0,254 0 2,54 2,54 2,54
Nombre 0,254 2,54 25,4 254 2540
Diviseur 25,4 25,4 25,4 25,4 25,4
Reste 0,254 2,54 0 1,42109E-14 1,42109E-13
Résultats identiques avec BigSur
En revanche, , si j'utilise la formule =CONVERT(A2;"cm";"in") puis B2,
etc, j'obtiens des nombres entiers,
0,254 2,54 25,4 254 2540
0,1 1 10 100 1000
donc pas de restes. (sauf pour 0,1 bien sÍ»r) qui correspond Í  1/10ème.
Il faudrait que tu trouves l'équivalent de cette formule en AS
--
Gérard FLEUROT
Avatar
M.V.
Le 4 décembre 2021 Í  00 h 54, Joseph-B a tenu les propos suivants :
pour info, avec 2,54 j'obtiens
0,254 - 0,0 - 2,54 - 2,54 - 2,54
et avec 25,4
0,254 - 2,54 - 0,0 - 1,42108547152E-14 - 1,42108547152E-13

Mêmes résultats sous Mojave comme te l'a dit Fleuger.
Mais je découvre que mod travaillait également avec des décimaux et pas
seulement avec des entiers. J'avais toujours pensé que c'était
équivalent Í  la congruence !
--
Michel VAUQUOIS - <http://michelvauquois.fr>
Avatar
Fleuger
Le 4 décembre 2021 Í  09:27, Fleuger a écrit ceci :
Il faudrait que tu trouves l'équivalent de cette formule en AS

++++++++++
set diviseur to 2.54
set serie to {0.254, 2.54, 25.4, 254, 2540}
set resultat to {}
set text item delimiters to " - "
set commentaire to "Résultat de la division par " & (diviseur as text) &
" de" & linefeed & (serie as string)
repeat with value in serie
copy (value div diviseur) to the end of resultat
end repeat
display alert (resultat's every item as text) message commentaire
+++++++++++
donne :
display alert "0 - 1 - 10 - 100 - 1000" message "Résultat de la division
par 2,54 de
0,254 - 2,54 - 25,4 - 254 - 2540"
C'est bien la formule mod qui crée ce résultat.
--
Gérard FLEUROT
Avatar
M.V.
Le 4 décembre 2021 Í  10 h 14, Joseph-B a tenu les propos suivants :
Voir ma réponse Í  pehache pour contourner le bug en AppleScript.

Les grands esprits se rencontrent :
<news:sofc6d$t7u$
Je vois que pour ta routine Modulo(), tu obtiens aussi des résultats du
type 0,0 et, pour moi, ça ne veut pas forcément dire 0 : 0,0 signifie,
pour moi, une valeur approchée au dixième du résultat !!!
--
Michel VAUQUOIS - <http://michelvauquois.fr>
Avatar
M.V.
Le 4 décembre 2021 Í  10 h 14, Joseph-B a tenu les propos suivants :
Merci Í  toi et MV pour vos tests.

Je viens de tester
return (2.001 - 2)
dans AS… Faut-il en rire ?
--
Michel VAUQUOIS - <http://michelvauquois.fr>
Avatar
Olivier Miakinen
Bonjour,
Le 04/12/2021 10:14, Joseph-B a écrit :
pehache 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

L'argument *est* recevable et *est* dérangeant mais c'est un problème
très connu depuis toujours avec les représentations des nombres en
binaire avec virgule flottante.
La solution consiste Í  travailler en nombres entiers dans une unité de
mesure suffisamment petite pour tous tes besoins. Par exemple, si tu
as besoin de représenter exactement 2,54 cm, il faut que ton unité de
mesure soit aussi petite que le dixième de millimètre. Pour être sÍ»r
de ne pas avor de problème, tu peux même travailler au micron (non, je
n'ai pas parlé de variant).
Tu coup, tes 2,54 cm par pouce, ça devient 25400 µm par pouce et c'est
tout Í  fait gérable en nombres entiers.
L͠ o͹ il n'est plus soutenable c'est pour (254 mod 2.54) ==> 2.54

C'est la même chose. La valeur la plus proche de zéro doit être un
nombre négatif, probablement quelque chose comme -1.4210854715202E-14.
Pour en faire un nombre entre 0 et 2,54 le résultat calculé est alors
2,54 - 1.4210854715202E-14, et Í  l'affichage ça donne 2,54.
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 !!

Le Mac n'est pas en cause, ce qui est en cause est inhérent aux calculs
en nombres flottants binaires, probablement IEEE 754. Passe en nombres
entiers et tes problèmes disparaitront.
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

C'est la même chose.
résultats totalement inacceptables

C'est Í  toi de ne *pas* les accepter, en utilisant des nombres entiers.
Ou alors il te faut une représentation décimale et non pas binaire, mais
je ne sais pas si c'est utilisable simplement dans tes programmes.
--
Olivier Miakinen
Avatar
josephb
M.V. wrote:
Les grands esprits se rencontrent :
<news:sofc6d$t7u$

Oui, puisque la fonction "Reste de division" est bugguée et pas la
fonction "partie Entière de division" la ruse est est vite trouvée, mais
quand même c'est grave puisque le bug semble inclus dans les bibli math
de l'OS.
Je vois que pour ta routine Modulo(), tu obtiens aussi des résultats du
type 0,0 et, pour moi, ça ne veut pas forcément dire 0 : 0,0 signifie,
pour moi, une valeur approchée au dixième du résultat !!!

Non, par convention dans AppleScript 0 signifie que les calculs et le
résultat ont eté effectués sur des entiers et 0.0 sur des réels, selon
ce que le compilateur aura jugé le plus adapté, ce n'est pas une
indication d'arrondi au 1/10ème.
Il a été beaucoup reproché Í  Applescript de ne pas obliger Í  déclarer le
type des variables et opérandes utilisés dans le script (Integer, Real,
String, List…), laissant Í  l'interpréteur deviner de quoi il retourne au
prix d'un gÍ¢chis de mémoire et risque d'erreur Í  l'exécution alors que
la compilation n'aura rien détecté d'incohérent.
Je viens de tester
return (2.001 - 2)
dans AS…

On peut préférer le résultat par javascript, il y en a pour tous les
goͻts.
Heureusement il y a toujours une parade programmatique simple :
return (2 - 2 + 0.001) dans cet ordre et pas (2+ 0.001-2)
Faut-il en rire ?

Surtout pas, c'est désormais interdit, et c'est tant mieux quand on
réalise l'empreinte carbone et la charge virale dangereusement exhalées
Í  chaque éclat de rire.
Sérieusement, ce qu'il nous faut c'est un·e contribut·eur·rice qui
voudra bien lancer un # indigné sur Twitter pour qu'Apple se sorte les
doigts…?
--
J. B.
Avatar
josephb
Olivier Miakinen <om+ wrote:
C'est Í  toi de ne *pas* les accepter, en utilisant des nombres entiers.

Tu me donnes des ordres ou c'est une formule réthorique ?
Dans tous les cas l'argument est irrecevable et je n'ai pas envie
d'épiloguer.
Merci de tes efforts, mais au mieux ça me donne Í  penser au sketch du
tailleur et du costume de Fernand Raynaud.
--
J. B.
Avatar
Olivier Miakinen
Le 04/12/2021 13:16, Joseph-B a écrit :
C'est Í  toi de ne *pas* les accepter, en utilisant des nombres entiers.

Tu me donnes des ordres ou c'est une formule réthorique ?

Ah non, ça c'est seulement si tu veux des résultats justes. Si tu
acceptes d'avoir des résultats aléatoirement faux, tu peux continuer
comme avant.
Pour info, le nombre 2,54 n'est pas représentable dans un flottant.
Les nombres les plus proches sont :
2 + 1215971899390033/2^51 =~ 2,539999999999999591437926
2 + 1215971899390034/2^51 =~ 2,540000000000000035527136
Je précise que ma réponse n'est pas liée au Mac, d'ailleurs je n'ai
jamais utilisé un Mac de ma vie (seulement des Windows et des Linux
depuis des décennies, et avant un Apple 2).
--
Olivier Miakinen
1 2 3