JUSTE UNE AUTRE LIBRAIRIE DE CALCUL EN PRÉCISION INFINIE

bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 - 23 avril 2004 à 17:01
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 29 févr. 2008 à 11:17
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/22182-juste-une-autre-librairie-de-calcul-en-precision-infinie

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 févr. 2008 à 11:17
Multiplication intégrée.
le fait que je soit désormais en base 10 000 au lieu de 10, pour la multiplication me fait faire bien moins d'opérations.

j'utilise, comme toi, la méthode classique, apprise sur les bancs de l'école.
pour deux nombres aléatoires de 4096 chiffres,
ton code met environ 9.75 secondes. dans les mêmes conditions, le mien mets 0.031 secondes.

Tout est relatifs, 4096 c'est des "petits" nombres, mais pour ce qui m'interesse, c'est amplement suffisant.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 févr. 2008 à 09:28
nuance saisie.

concernant le code, rien d'exceptionnel, j'ai optimisé la chose de manière a limiter les accès aux tableaux...
limiter les ReDim
les montants dans les tableaux sont stockes dans l'ordre inverse de ce qu'on lit (les chiffres de poids faible en premier)
après, la facon dont c'est stocké et géré, l'user le sait pas... il créé ses BigInt, joue avec. a la fin, il peut en demander le rendu.
dnob700 Messages postés 44 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 5 novembre 2007
29 févr. 2008 à 00:33
Penser que ça ne rivalise pas avec de l'assembleur n'est pas la bonne façon de voir les choses je pense. Car le meilleur code est certainement obtenu en compilant du C ou du C++ avec ICC. Le résultat est tellement tordu (et optimisé) qu'aucun humain ne pourrait faire aussi bien.

Il n'y a plus vraiment de notion de coprocesseur de calcul dans les processeurs moderne (ça date du temps ou on rajoutait un processeur dans la machine). Il y a différents jeux d'instructions pour différent usages, le descendant du coprocesseur de calcul qui est le FPU utilise son jeux d'instruction (les instructions dites x87), les instructions SSE (1,2, 3 et bientôt 4, anciennement MMX et 3DNow) sont celles des puces SIMD prévues à la base surtout pour le traitement multimédia mais qui sont aussi très adapté au calcul entier.

Et justement, le compilo ICC est capable d'employer les instructions les plus adaptées, là où un humain ne pourrait jamais choisir la meilleur instruction.

Si ça t'intéresse, je dois avoir quelque part un meilleur code que celui ci, que j'ai écris en C. Néanmoins, si tu as des gains de performances tel que tu le dit, je serais aussi très intéressé par voir comment tu code ça en VB6 (même si je n'utilise plus ce langage depuis des années).
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 févr. 2008 à 23:32
je codes cela en VB6... ca ne rivalise bien sur pas avec de l'asm, encore moins avec du SSE (asm du coprocesseur de calcul) ...
mais bon, pour les bases, là, je suis satisfait.

je viens de passer ce soir de la base 100 à la base 10000 pour stocker les fragments en mémoire. Reste encore la multiplication, division, puissance et modulo pour que les besoins que j'ai soient satisfaits.
dnob700 Messages postés 44 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 5 novembre 2007
28 févr. 2008 à 20:55
Merci pour ton appréciation de ma source.

En quoi code tu ton programme ? qu'on puisse faire mieux que ce que j'ai fait à l'époque ça me semble très plausible (il n'y a aucune optimisation "intelligente" dans ce code), après tout, je l'ai écrit il y a des années de ça, mais le VB6 a quand même une vitesse d'exécution limité.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 févr. 2008 à 11:16
je reviens sur mon commentaire d'hier: les nombres négatifs sont bel et bien gérés
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 févr. 2008 à 11:15
Mon code avance plutot bien...
(ce dont je me suis inspiré, c'est ta bonne idée de stocker 0-99 dans un byte)

En mode compilé, pour comparer deux BigInt de 201096 chiffres (identiques),
je mets 0.0156 secondes. ton code mets 0.9688 secondes: je mets 1.6% du temps que tu mets pour cette même opération.
L'addition de ces mêmes nombres prend 1.0938 secondes chez toi, 0.1562 chez moi (14.28% de ton temps)

Pour comparer ce même BigInt de 201096 chiffres avec un deuxième qui aurait pour valeur "1", par exemple, tu mets 0.4688 secondes (le temps mis par mon code n'est pas mesurable: c'est instantané.

Bref, presque quatre ans après le dépot de ta source, le sujet risque d'être relancé.
Merci pour les bases de code (je suis nul en calcul)

++
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 févr. 2008 à 17:06
aujourd'hui, je crypte, j'ai besoin de longs entiers.
je me suis inspiré de ton code, qui me semble être l'un des meilleurs de VbFrance.

j'ai gardé ta classe sous le coude, pour y confronter mes resultats.
sur de "simples" additions, j'enregistre d'importants gains de performance...
je prend en moyenne 80% de temps en moins.

je posterai quand y'aura tout ce dont j'ai besoin (pas de décimaux ni de nombres négatifs...)
MalCoM33 Messages postés 3 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 5 novembre 2005
5 nov. 2005 à 00:11
Salut !!!
est ce que sa serait possible d'obtenir le code source de la calculette
merci..
cs_santiago69 Messages postés 91 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 17 décembre 2008
6 sept. 2005 à 13:24
je viesn de poster une comparaison des algo de DNOB700 et us_30 sur les vitesses de calcul des grands nombre sur la page suivante :
http://www.vbfrance.com/code.aspx?ID=31544
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
26 avril 2004 à 15:22
Bon courage et bonne prog !
++
dnob700 Messages postés 44 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 5 novembre 2007
24 avril 2004 à 00:51
Je suis vraiment très bête : j'ai écrit les classes pour les nombre et leur interface.

Et j'était en train de réécrire l'addition quand je em susi apercu que je faisais vraimet n'importe quoi : j'enregistrais mes nombre comme avant sauf avec une valeur a coté qui disait le nobmre de chiffre après la virgule dans un tableau de 1 à x.
Il suffirait d'utilisé un tableau de -y à x et ca serait bcp plus simple. Il faut juste réécrire tout mon programme !!!

Par contre j'ai abandonné pour l'instant l'idée du DByte, c'est trop complexe. Peut-être que quand tout marchera de nouveau, je le réecrirais. Mais en attendant, je me suis rabattu sur Byte pour l'interface avec une automatisation assez bien (je dirais même qu'elle est plutot pas mal) pour récuperer et mettre a jours les Str ou Byte selon ce qu'il faut.

Je mettrais la source a jours bientot.
dnob700 Messages postés 44 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 5 novembre 2007
23 avril 2004 à 18:54
Bon, je le ferais ce weekend :
- ne plus utiliser que des DByte...
- Mettre dans une classe (pour l'implementer dans une DLL)
- commentez (heu, ca c'est pas sur !)
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
23 avril 2004 à 18:27
Si tu peux faire cela c'est vraiment terrible.

Une question, est-il possible de faire une dll à partir de ton code ?

Une autre chose, si tu pouvais commenter à peine plus, je n'ai jamais encore manipuler les byte et je n'y comprend pas grand chose.

Encore bravo
dnob700 Messages postés 44 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 5 novembre 2007
23 avril 2004 à 17:27
En fait j'y ai pensé, et ca ne néssécite même pas vraiment de réécrire le code :

Il suffirait de faire un type :
private type Nombre
Valeur as byte
StrValeur as String
Virgule as integer
Signe as boolean
end type

on peut même en faire une classe pour convertir les strValeur en Valeur tout cours. Bon, pour le reste, les calcul sont absolument inchangé, sauf que la multiplication additionne les virgule (qui ne sont que le nombre de chiffre après la virgule.
pour les addition et soustraction, c'est la partie qui égalise les nombre qui est a revoir (mais c'est pas grand chose non plus)

Mais en fait, il s'agissait ausi d'un choix de ne pas gérer les virgule, car j'utilisait la fonction modulo pour du cryptage RSA (mais un peulent quand même).

Bon, je vais voir ce que je peut faire, je le ferais peut-être pendant le weekend.
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
23 avril 2004 à 17:01
Vraiment très bien et rapide, meme si le code est effectivement un peu brouillon. Les calculs sont relativement rapides même avec de très grands nombres.
Quel dommage que tu ne prennent pas en charges les virgules.
Si je peux me permettre
J'ai un truc (meme chose que quand tu le fait à la main) il faut se débarraser des decimales.

Pour les divisions
Soit X / Y.
Soit X possedant 6 décimales et Y possédant 3 décimales
1°- Tu multiplie X et Y par (10 puissance 6x3 ; soit 10 puissance 18)
2°- Ou bien tu multiplie X par 100000 et Y par 1000 et pour ton resultat tu fais Resultat = Resultat x 1000 / 100000

Pour les multiplications meme principe sauf que
idem petit 2°- mais Resultat = Resultat / (X x Y)

Pour les soustractions et additions
Soit X possede 6 decimales et Y possede 3 decimales
Tu multiplie X et Y par 10 puissance 6 (le plus gros)
tu fais ton operation et tu divise par 10 puissance 6

Si tu nous fais la meme chose mais avec prise en charge des virgules dans les variables d'entrées et de sorties tu mérite 15/10, pour l'instant je te met 8/10 pour te motiver.
Continue c'est du bon boulot.
Rejoignez-nous