Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1373 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1525730
papangue
Posté le 08-03-2007 à 11:08:46  profilanswer
 

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
mood
Publicité
Posté le 08-03-2007 à 11:08:46  profilanswer
 

n°1525806
papangue
Posté le 08-03-2007 à 14:13:12  profilanswer
 

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
n°1525844
Joel F
Real men use unique_ptr
Posté le 08-03-2007 à 15:04:46  profilanswer
 

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)

n°1525970
Taz
bisounours-codeur
Posté le 08-03-2007 à 17:38:14  profilanswer
 

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

n°1525981
Taz
bisounours-codeur
Posté le 08-03-2007 à 17:49:08  profilanswer
 

peut etre bientot standardisé.
 
Sinon y a GMP

n°1526095
el muchach​o
Comfortably Numb
Posté le 09-03-2007 à 02:17:03  profilanswer
 

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
n°1526176
papangue
Posté le 09-03-2007 à 10:00:41  profilanswer
 

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....

n°1526222
Dag elg
Posté le 09-03-2007 à 10:33:14  profilanswer
 

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

n°1526297
Taz
bisounours-codeur
Posté le 09-03-2007 à 11:38:46  profilanswer
 

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.

n°1526520
papangue
Posté le 09-03-2007 à 16:36:00  profilanswer
 

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,
 

mood
Publicité
Posté le 09-03-2007 à 16:36:00  profilanswer
 

n°1526522
++fab
victime du syndrome IH
Posté le 09-03-2007 à 16:38:26  profilanswer
 

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
n°1526675
Taz
bisounours-codeur
Posté le 09-03-2007 à 23:47:28  profilanswer
 

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.

n°1526700
el muchach​o
Comfortably Numb
Posté le 10-03-2007 à 08:57:40  profilanswer
 

+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
n°1526705
papangue
Posté le 10-03-2007 à 09:22:12  profilanswer
 

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
n°1526908
el muchach​o
Comfortably Numb
Posté le 10-03-2007 à 20:30:21  profilanswer
 

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
n°1527021
papangue
Posté le 11-03-2007 à 11:40:17  profilanswer
 

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.

n°1639715
homeomorph​e
Posté le 09-11-2007 à 09:01:36  profilanswer
 

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
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
passage d'une fonction comme argument pour une autre fonction (Résolu)[RESOLU] [SQL] Utilisation de champs dans un case CASE
[resolu][php/html] recevoir les info d'un formulaire par mail[Résolu] Envoi d'un mail en PHP
[résolu] array_unique() pour tableaux multidimensionnels[résolu] Compter le nombre d'entrées de plusieurs tables
[Résolu]Liste déroulante dynamique qui ne s'affiche pasVBA access fermer word [résolu]
[résolu] Besoin d'aide pour un conversion Pascal->php[Ajax] [résolu] souci reponse du serveur
Plus de sujets relatifs à : [résolu] C++: double : limitation à 15 digits - comment aller au dela?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR