double vs long double

double vs long double - C - Programmation

Marsh Posté le 16-06-2006 à 16:34:13    

Bonjour,
 
j'ai fait un programme qui manipule des double. Malheureusement, sur de gros exemples de traitements, j'obtient un dépassement...  :sweat:  
 
Don mon premier reflexe est de remplacer ce double par un long double ...  
 
Ma question est de savoir si cela ne pose pas un problème, car il me semble que ce type n'est pas tres standard ...? Y a t'il des problèmes connus  
avec ce genre de type de données (selon le processeur, le systeme d'exploitation,...) ?  
 
Sinon auriez-vous une autre idée pour résoudre le problème (sachant que je passe déjà par le log...) ?
 
Merci  :jap:

Reply

Marsh Posté le 16-06-2006 à 16:34:13   

Reply

Marsh Posté le 16-06-2006 à 17:04:44    

Le type "long double" est défini dans la norme C89, il faut donc chercher un compilateur antédiluvien pour que ce ne soit pas reconnu. :)
 
Après, si long double n'est pas suffisant, il te faudra peut-être utiliser/développer une bibliothèque mathématique spécialisée dans les très grands nombres.

Message cité 2 fois
Message édité par Elmoricq le 16-06-2006 à 17:05:59
Reply

Marsh Posté le 16-06-2006 à 17:13:29    

Elmoricq a écrit :

Le type "long double" est défini dans la norme C89, il faut donc chercher un compilateur antédiluvien pour que ce ne soit pas reconnu. :)
 
Après, si long double n'est pas suffisant, il te faudra peut-être utiliser/développer une bibliothèque mathématique spécialisée dans les très grands nombres.


 
ok merci !

Reply

Marsh Posté le 16-06-2006 à 17:23:19    

Fais tout de même attention : en C, seules les tailles minimum des types sont définies, pas les tailles maximum.
 
Par exemple, il est dit qu'un entier de type "int" doit mesurer au minimum 16 bits.
A l'heure actuelle, "int" pèse souvent 32 bits, et sans doute déjà 64 sur pas mal de système. Mais la norme, c'est 16 bits.
 
Ce qui signifie qu'il faut que tu fasses attention à te limiter à la norme quant à la plage utilisable, si tu tiens à faire quelque chose de portable.

Reply

Marsh Posté le 16-06-2006 à 17:29:03    

effectivement il va falloir que je me penche la dessus !  
 
Merci pour ces eclaircissements :)

Reply

Marsh Posté le 16-06-2006 à 22:34:07    

Elmoricq a écrit :

Le type "long double" est défini dans la norme C89,


Tu es sûr de ça ? Je ne connais pas de fonctions maths spécialisées pour ça dans la bibliothèque standard du C90. Par contre, en C99, oui.
 
Par exemple : http://www-ccs.ucsd.edu/c/math.html
 
On voit bien que les fonctions avec long double sont notées 'C++ only'.

Message cité 1 fois
Message édité par Emmanuel Delahaye le 16-06-2006 à 22:36:44

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-06-2006 à 23:12:11    

Emmanuel Delahaye a écrit :

Tu es sûr de ça ? Je ne connais pas de fonctions maths spécialisées pour ça dans la bibliothèque standard du C90. Par contre, en C99, oui.


 
je n'ai pas k&r ni le standard pour verifier, mais d'apres wikipedia fr c'est bien c89 (et n'existe pas en pre-ansi)
http://fr.wikipedia.org/wiki/C_%28langage%29#Types
 
edit: d'ailleur avec gcc je compiles toujours en -ansi et il m'arrive d'utiliser 'long double' sans probleme

Message cité 1 fois
Message édité par skelter le 16-06-2006 à 23:13:51
Reply

Marsh Posté le 16-06-2006 à 23:23:54    

skelter a écrit :

je n'ai pas k&r ni le standard pour verifier, mais d'apres wikipedia fr c'est bien c89 (et n'existe pas en pre-ansi)
http://fr.wikipedia.org/wiki/C_%28langage%29#Types


C'est écrit :  

Citation :

Types à virgule flottante : float, double, long double (C89)


Ca ressemble fort à une typo... Je le verrais comme ça...

Citation :

Types à virgule flottante : float, double, long double (C99)


Wikipedia, c'est plein de bugs. J'en ai corrigé quelques uns (comme les >= au lieu de = dans la même page), mais il en reste sûrement...
 
EDIT: OK, d'après mon K&R edition 2, le type long double existe bien en C89/C90.

Message cité 1 fois
Message édité par Emmanuel Delahaye le 16-06-2006 à 23:26:31

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-06-2006 à 23:32:38    

Citation :

Ca ressemble fort à une typo... Je le verrais comme ça...


 
pas forcement, le fait de preciser c89 peut simplement vouloir dire que c'est une nouveauté apporté par le standard comme void et const
 

Citation :

Wikipedia, c'est plein de bugs. J'en ai corrigé quelques uns (comme les >= au lieu de = dans la même page), mais il en reste sûrement...


 
absolument, le feedback sur wikipedia est rapide pour le gros mais dans le details des erreurs peuvent trainer des mois, voir des annees. J'attendais que tu confirmes si tu avais k&r ou le standard sous la main (et corriger wikipedia si besoin).


Message édité par skelter le 16-06-2006 à 23:33:23
Reply

Marsh Posté le 17-06-2006 à 02:44:58    

quel genre de dépassement ? ne devrait tu tout simplement pas changer d'algorithme ?
 
deux cas possibles :
- tu constates une perte de précision sur par exemple une somme. Il y a beaucoup de travaux qui montre que for ( ... ) { sum += data[i] } est une très mauvaise méthode. Tu peux trouver sur le net des tas d'autres algorithmes bien meilleurs qui limitent la perte de précision. Ce genre de problème apparaît dans beaucoup d'autres algorithmes numériques.
 
- logarithme est ton ami

Reply

Marsh Posté le 17-06-2006 à 02:44:58   

Reply

Marsh Posté le 17-06-2006 à 03:16:04    

Oui, et quelques fois, il est bon de réordonner les opérations commutatives pour limiter les pertes. Par ex. si dans un calcul il y a plein de multiplications suivies d'un tas de divisions, (ou des additions suivies de soustractions), réfléchir à les alterner ou les grouper de façon intelligente pour limiter les pertes.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 17-06-2006 à 12:06:11    

Emmanuel Delahaye a écrit :


EDIT: OK, d'après mon K&R edition 2, le type long double existe bien en C89/C90.


Il me semble que c'est long long int qui a été introduit en C99.

Reply

Marsh Posté le 19-06-2006 à 10:07:38    

Taz a écrit :

quel genre de dépassement ? ne devrait tu tout simplement pas changer d'algorithme ?
 
deux cas possibles :
- tu constates une perte de précision sur par exemple une somme. Il y a beaucoup de travaux qui montre que for ( ... ) { sum += data[i] } est une très mauvaise méthode. Tu peux trouver sur le net des tas d'autres algorithmes bien meilleurs qui limitent la perte de précision. Ce genre de problème apparaît dans beaucoup d'autres algorithmes numériques.
 
- logarithme est ton ami


 
Je passe déjà en log ... :jap:

Reply

Marsh Posté le 19-06-2006 à 10:10:22    

En fait l'erreur est réparée ... Merci beaucoup tout le monde !

Reply

Marsh Posté le 30-06-2006 à 01:33:14    

julien_54 a écrit :

En fait l'erreur est réparée ... Merci beaucoup tout le monde !


Elle etait ou ta division par 0 ?  :o

Reply

Sujets relatifs:

Leave a Replay

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