Path: ...!weretis.net!feeder6.news.weretis.net!feeder8.news.weretis.net!news.trigofacile.com!usenet-fr.net!.POSTED!not-for-mail From: Olivier Miakinen Newsgroups: fr.comp.sys.mac.programmation Subject: =?UTF-8?Q?Re:_Y_a_comme_un_d=c3=a9faut?= Date: Sat, 4 Dec 2021 12:48:11 +0100 Organization: There's no cabale Lines: 61 Message-ID: References: <1pjmz6k.1v0nod6mfq0rkN%josephb@nowhere.invalid> <1pjnmh9.11fmmgjvnnxyuN%josephb@nowhere.invalid> NNTP-Posting-Host: 220.12.205.77.rev.sfr.net Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Trace: cabale.usenet-fr.net 1638618491 25705 77.205.12.220 (4 Dec 2021 11:48:11 GMT) X-Complaints-To: abuse@usenet-fr.net NNTP-Posting-Date: Sat, 4 Dec 2021 11:48:11 +0000 (UTC) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0 SeaMonkey/2.49.4 In-Reply-To: <1pjnmh9.11fmmgjvnnxyuN%josephb@nowhere.invalid> Bytes: 3700 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