OVH Cloud OVH Cloud

Gros challenge : Javascript et arrondis (suite)

3 réponses
Avatar
J. Smith
Bonjour,

Suite à mon post précédent, je me suis en fermé 48h et ai fini par coder un
script assez coton qui permet de limiter les décimales d'un nombre, quelle
que soit sa forme d'entrée dans la fonction (0.0001 = 1e-4 = 10e-5 =
0.1e-3).

Mais j'atteins les limites de mon script avec les calculs à très grandes
décimales, sur certains chiffres en particulier (je n'ai pas vraiment encore
identifié la constante qui fait que ces chiffres ne fonctionnent pas).

Bref, ceci pour vous demander :

Connaissez-vous un moyen pour pouvoir avoir un résultat fiable (sans
apparition d'artefact*) sur des calculs simples (+ - / *) avec de grands
chiffres du type :

999999999999999999.000000000000000000000000000000000000009
0.00000000000000000000000000000000000000000000009
999999999999999999999999999999999999999.3


ex : 10.99999999 * (1e3 / 1e-10) donne des résultats absolument délirants,
alors que le chiffre final est supposé être un entier.


Merci

3 réponses

Avatar
Patrick Mevzek
Connaissez-vous un moyen pour pouvoir avoir un résultat fiable (sans
apparition d'artefact*) sur des calculs simples (+ - / *) avec de grands
chiffres du type :


Quand on n'a ce genre de problèmes:
1) soit on ne travaille pas en virgule flottante
(ie précision fixe, x chiffres avant et y chiffres après la virgule)
2) soit on ne travaille qu'avec des entiers
(ex: prix de la vie de tous les jours * 100, comme ca pas de décimales
pour le calcul)
3) soit on stocke les nombres sous forme de chaines de caractères.

A part 2), le reste ne me semble pas trivial en javascript.

Bon courage.

La question que je me pose : mais pourquoi diantre avez-vous besoin de
tout cela en javascript ?

--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>

Avatar
J. Smith
Merci :-)

J'ai besoin de cela en Javscript pour pouvoir donner un résultat en temps
réel sans aller-retour serveur ni applet Java. Ceci dit, je suis parti pour
opter pour la solution 3. Je suis en train de recoder à la main les algo de
calcul en les basant sur des entrées de type String.

C'est fou ce que je m'amuse :-)
Et je confirme, ça n'est pas trivial en Javascript.

Ceci dit, je suis toujours à l'écoute de toute aide qui me permettrait
d'éviter de passer des heures de recodage from scratch.

@+


"Patrick Mevzek" a écrit dans le message de

Quand on n'a ce genre de problèmes:
1) soit on ne travaille pas en virgule flottante
(ie précision fixe, x chiffres avant et y chiffres après la virgule)
2) soit on ne travaille qu'avec des entiers
(ex: prix de la vie de tous les jours * 100, comme ca pas de décimales
pour le calcul)
3) soit on stocke les nombres sous forme de chaines de caractères.

A part 2), le reste ne me semble pas trivial en javascript.

Bon courage.

La question que je me pose : mais pourquoi diantre avez-vous besoin de
tout cela en javascript ?


Avatar
zwetan

J'ai besoin de cela en Javscript pour pouvoir donner un résultat en temps
réel sans aller-retour serveur ni applet Java. Ceci dit, je suis parti
pour

opter pour la solution 3. Je suis en train de recoder à la main les algo
de

calcul en les basant sur des entrées de type String.



et ce sera tres lent...

C'est fou ce que je m'amuse :-)
Et je confirme, ça n'est pas trivial en Javascript.

Ceci dit, je suis toujours à l'écoute de toute aide qui me permettrait
d'éviter de passer des heures de recodage from scratch.



lire dans le volume 2 de "Donald E Knuth - The Art Of Computer Programming"
le chapitre 4.3 Multiple precison arithmetic

ensuite au lieu d'utiliser des strings, utilise plutot une array de number
et oui tu devras redefinir tous les operateurs: addition, soustraction
etc...

dans ton array utilise des multiples de 10 (10..100, 1000 etc...)
ca te permettra de calculer tres facilement la representation string du
number

entraine toi avec une array en base 10 -> [0,0,0,...]

quand tu crees un grand nombre, tu le decomposes
et tu remplis l'array
ex avec 100
ton array donnera [1,0,0]

si tu additiones 900 a 100
[1,0,0]
[9,0,0]

1+ 9 = 10 et > 9 donc tu decales a gauches
etc..

c'est un peu compliqué mais avec cette technique tu peux arriver
avec des calculs supportant une precision sur 64, 128 bits etc..
ensuite selon les calculs a faire et le degré de precision
ca peut se reveler assez lent ou au contraire pas du tout

si tu restes sur les operateurs de base (+,-,/,*)
dans une utilisation style excell..ce sera rapide

si tu comptes faire de la generation de nombre premier
sur 256 bits...ce sera TRES TRES TRES TRES lent

bon courage
zwetan