[résolu] C++: double : limitation à 15 digits - comment aller au dela?

C++: double : limitation à 15 digits - comment aller au dela? [résolu] - C++ - Programmation

Marsh Posté le 08-03-2007 à 11:08:46    

Salut,
j'ai un léger soucis de précision de calcul sous visual studio qui ne supporte pas les "long double" malheureusement (long double = double codé sur 64 bits).
J'aurais besoin de plus de précision.
Connaitriez vous une classe implementant ce genre de nombre avec les opérations arithmetiques de base?
 
En vous remerciant.

Message cité 1 fois
Message édité par papangue le 09-03-2007 à 16:37:12
Reply

Marsh Posté le 08-03-2007 à 11:08:46   

Reply

Marsh Posté le 08-03-2007 à 14:13:12    

Roob a écrit :

double Flottant double -1.7*10^-308 à 1.7*10^308 : 8 octets
long double Flottant double long 10 -3.4*10^-4932 à 3.4*10^4932  : 10 octets
 
Le type double ne te suffit pas ?


 
salut, merci à toi pour ta réponse.
Mon problème n'est pas lié au plus grand nombre que je peux codé mais au nombre de digit significatifs disponible.
 
Je m'explique, en théorie le long double (19 ou 20 digits) devrait me suffir mais sous visual studio ce type de base est mappé vers le double (15 digits). Or je dois faire une difference entre 2 nombre très très grands (>10^14) et très très proches (difference <10^-4): il me faut donc 14+4=18 digit pour avoir un résultat pas trop mauvais.
 
exemple:

Code :
  1. double a = 1.2345678901122334e14; // sera codé en mémoire comme 1.23456789011223e14
  2. double b = 1.2345678901122384e14; // sera codé en mémoire comme 1.23456789011224e14
  3. double c = a -b;                            // aura pour résultat 1 => alors que le résultat réel est 0.5 => erreur trop           
  4.                                                  // grande pour mon probleme


 
Le probleme vient du epsilon du type double pour ces grandes valeurs...le epsilon est plus grand que le résultat que je doit obtenir. je suis dans le bruit numerique.
Il me faut une classe codant des nombres sur plus d'octets (ou de bit)...1 bit de plus me suffirait largement!

Message cité 1 fois
Message édité par papangue le 08-03-2007 à 14:13:58
Reply

Marsh Posté le 08-03-2007 à 15:04:46    

y a des bibliothèques pour ça sinon ;)
long double ca n'existe que sur certaines plateformes (PPC G5 avec xlc de tête et certainement les linux 64 bits sur AMD)

Reply

Marsh Posté le 08-03-2007 à 17:38:14    

papangue a écrit :

Or je dois faire une difference entre 2 nombre très très grands (>10^14) et très très proches (difference <10^-4): il me faut donc 14+4=18 digit pour avoir un résultat pas trop mauvais.

Là je suis pas. Les flottants ça marche pas comme ça. 1e14 + 1e-4 -> 1e14

Reply

Marsh Posté le 08-03-2007 à 17:49:08    

peut etre bientot standardisé.
 
Sinon y a GMP

Reply

Marsh Posté le 09-03-2007 à 02:17:03    

Salut,

 

Ton problème est curieux. Comment ça se fait que tu aies à faire un tel calcul ? Dans quel cadre ?

 

Si c'est dans le cadre d'un calcul numérique, alors je pense que tu peux tout arrêter, parce qu'il est probable que soit ton problème est mal posé (tu es dans des conditions qui rendent ton système instable), soit ton algo est très mauvais, et dans les deux cas, tu risques de te heurter au même problème. Car l'un des buts de l'analyse numérique est justement d'éviter ce genre de situation où l'on arrive au bout de la précision machine disponible.

 

Mais p-ê est-ce autre chose ?


Message édité par el muchacho le 09-03-2007 à 02:24:09
Reply

Marsh Posté le 09-03-2007 à 10:00:41    

Merci à tous....
Ce problème est rencontré dans le cadre de mon travail (recherche scientifique).
Il s'agit en fait d'un produit matriciel: ma matrice est a diagonale dominante (je n'ai pas choix)... du coup le produit est complètement faux.
 
J'ai essayer de reconditionner le problème... mais c'est en vain.
 
Je sais que pour réduire le bruit numeric il faut sommer les nombres dans l'ordre croissant. Mais bon je n'ai pas beaucoup  de liberté sur les algorithmes que j'utilise (sauf si je réécris tout)...
 
Je suis en train de voir vers GMP mais je galère pas mal à le compiler avec cygwin....

Reply

Marsh Posté le 09-03-2007 à 10:33:14    

tu peux pas separer ta matrice en 2.: 1 matrice diagonale + 1 autre avec les autre termes et faire 2 calculs separes?

Reply

Marsh Posté le 09-03-2007 à 11:38:46    

papangue a écrit :

Merci à tous....
Ce problème est rencontré dans le cadre de mon travail (recherche scientifique).
Il s'agit en fait d'un produit matriciel: ma matrice est a diagonale dominante (je n'ai pas choix)... du coup le produit est complètement faux.
 
J'ai essayer de reconditionner le problème... mais c'est en vain.
 
Je sais que pour réduire le bruit numeric il faut sommer les nombres dans l'ordre croissant. Mais bon je n'ai pas beaucoup  de liberté sur les algorithmes que j'utilise (sauf si je réécris tout)...
 
Je suis en train de voir vers GMP mais je galère pas mal à le compiler avec cygwin....


Bah si tu travail, donne toi les moyens de travailler et paie toi un vrai environnement de développement.
 
Sinon si tu en est à faire prod(Di), il y a plusieurs façons de le faire. Une multiplication simple va effectivement donner de mauvais résultats. Tu peux trouver sur net plein d'algo pour faire une multiplication de liste avec le maximum de précision. Le plus simple étant de procéder par multiplication successive entre terme proches pour minimiser les pertes. Penche toi aussi sur les méthodes qui permettent de quantifier cette perte (parce qu'un résultat n'est rien si on ne connaît pas sa précision).
Et tout ça vaut aussi pour une somme.

Reply

Marsh Posté le 09-03-2007 à 16:36:00    

Taz a écrit :

Bah si tu travail, donne toi les moyens de travailler et paie toi un vrai environnement de développement.
.


  :sweat: euhh je ne vois pas ce que cela vient faire ici....
 
 
De toute façon il apparait évident que je suis face à un problème auquel je ne m'attendais pas.
Je m'oriente actuellement vers une solution du type GMP et/ou MPFR qui a mon avis peuvent être d'un secours non négligeable dans mon cas.
 
Je sais aussi que l'optimisation (ou arrangement des operation) peuvent minimiser mon erreur de calcul... mais je n'ai vraiment pas envie de passer mon temps à cela... je suis malheurseuement à la limite du bruit numerique (utilisation de grands nombres qui génèrent des petits nombres et vice versa). comme je suis à cette limite mon code une telle optimisation ne permettra pas d'avoir un code robuste (en fonction des paramètres d'entré du problème). Il me faut une fenêtre opérationnelle un peu plus grande que cela donc coder mes nombres sur plus d'octets... et cela est proposé par GMP et/ou MPFR.
 
en vous remerciant tous pour votre aide,
 
Cdt,
 

Reply

Marsh Posté le 09-03-2007 à 16:36:00   

Reply

Marsh Posté le 09-03-2007 à 16:38:26    

Taz a écrit :

peut etre bientot standardisé.


Tu parles de _Decimal128, ou du genre ?

 
Taz a écrit :

Sinon y a GMP


Je n'ai aucune expérience avec, mais MPFR -basé sur GMP- a l'air tout indiquée.
edit: toasted


Message édité par ++fab le 09-03-2007 à 16:40:34
Reply

Marsh Posté le 09-03-2007 à 23:47:28    

papangue a écrit :

:sweat: euhh je ne vois pas ce que cela vient faire ici....

ça vient que tu es dans un non-environnement puisque tu dois compiler avec peine un bouzin disponible sur toutes les plateformes sérieuses.
 
 
fab++ : oui.
Et GMP ça fonctionne, mais ça a un prix. Et puis la fuite en avant 'je ne maîtrise pas quelque chose, j'en prends un autre inconnu' ça fait bof. Je vois déjà le topic suivant avec une matrice de rang 100, un fixed point à 100 et les 99 multiplications qui en découlent ...
Encore une fois il y a de très bon algo de somme/produit pour minimiser les pertes avec des coûts raisonnables. Et également des tas d'astuces pour remplacer certains calculs délicats par d'autres (comme cos (1 - x) par exemple). Le plus idiot et certainement le moins bon consistant à ordonner les valeurs et à opérer d'abord sur les plus petites.

Reply

Marsh Posté le 10-03-2007 à 08:57:40    

+1 avec Taz.
Ca me donne l'impression que papangue ne maitrise pas complètement ce qu'il fait, et ça pourrait avoir comme conséquence que les résultats de ses calculs soient complètement faux sans même qu'il s'en rende compte.
Je pense que papangue devrait s'adresser à des gens qui s'y connaissent un minimum en modélisation/calcul numérique, ça doit exister dans son labo ou aux alentours.

Message cité 1 fois
Message édité par el muchacho le 10-03-2007 à 09:03:29
Reply

Marsh Posté le 10-03-2007 à 09:22:12    

el muchacho a écrit :

+1 avec Taz.
Ca me donne l'impression que papangue ne maitrise pas complètement ce qu'il fait, et ça pourrait avoir comme conséquence que les résultats de ses calculs soient complètement faux sans même qu'il s'en rende compte.
Je pense que papangue devrait s'adresser à des gens qui s'y connaissent un minimum en modélisation/calcul numérique, ça doit exister dans son labo ou aux alentours.


 
-1 avec vous 2, car je sais parfaitement ce que je fais et heureusement, et je maitrise parfaitement mon code...
Pour info ca fait maintenant presque 7 ans que je fais de la simulation numérique en R&D - et pour valider des résultats il y a bien d'autre manière que de se poser la question: est-ce que j'ai écrit est juste ou faux?
 
Enfin pour terminer si j'ai fait appel à vous c'est pas pour que vous jugiez mon travail (dont vous n'avez aucune idée)... mais que vous me donniez un coup de main, car j'étais à la recherche d'une bibliothèque particulière permettant de manipuler des nombres precis - la question initiale était pourtant claire il me semble...
 
Merci encore.


Message édité par papangue le 10-03-2007 à 09:40:43
Reply

Marsh Posté le 10-03-2007 à 20:30:21    

Je suis plutôt étonné que tu viennes nous poser ce genre de questions si tu fais de la simulation numérique depuis 7 ans. Tu devrais en savoir bcp plus long que nous sur le sujet. Parce que pour GMP, tu n'avais pas tellement besoin de nous.[:spamafote]
Et en effet, tu ne nous as pas donné assez d'infos pour qu'on puisse te répondre précisément.


Message édité par el muchacho le 10-03-2007 à 20:34:35
Reply

Marsh Posté le 11-03-2007 à 11:40:17    

Moi je n'ai pas envie d'entrer dans une discussion sterile. Ce que je fais ou ne faipas et depuis quand n'est pas le sujet de ce topic.
 
Pour GMP il me manquait juste l'info.
 
Merci encore pour votre aide à tous... ceci sera ma dernière intervention sue ce topic.

Reply

Marsh Posté le 09-11-2007 à 09:01:36    

papangue a écrit :

Salut,
j'ai un léger soucis de précision de calcul sous visual studio qui ne supporte pas les "long double" malheureusement (long double = double codé sur 64 bits).
J'aurais besoin de plus de précision.
Connaitriez vous une classe implementant ce genre de nombre avec les opérations arithmetiques de base?
 
En vous remerciant.


 
Salut,je viens un peu tard pour ton pb,si ce n'est pas le cas contacte moi sur mon mail
serge.ganoucheau@numericable.fr
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed