Pour les balezes en C : division par 0 sous linux OK mais pas win

Pour les balezes en C : division par 0 sous linux OK mais pas win - C++ - Programmation

Marsh Posté le 08-01-2003 à 21:15:33    

SAlut,
 
Je developpe depuis de nombreuses annees en C (systeme et haut niveau) donc je commence a connaitre le langage mais je viens de tomber sur un bout de code qui me laisse perplexe :
 

Code :
  1. #define min(a,b) ((a)<(b) ? (a):(b))
  2. #define max(a,b) ((a)>(b) ? (a):(b))
  3. #define Inf 1.0/0.0
  4. #define NaN  0.0/0.0


 
 
Les 2 dernieres lignes , je comprends pas comment ca peut marcher ... et pourtant sous linux , ca marche (sous windows il refuse a cause de la division par 0)
 
 

Code :
  1. if (!strcmp(ch,"Inf" )){
  2.                 x=Inf;
  3.         }


 
 
L affectation dans x se passe bien, et la comparaison avec Inf dans la suite du code fonctionne aussi.
 
Comment ca peut etre possible, je pensais que les notions d infini n existait pas sur un ordi.
 
 
Merci d avance.

Reply

Marsh Posté le 08-01-2003 à 21:15:33   

Reply

Marsh Posté le 08-01-2003 à 21:31:42    

normal, c'est un "UB" (undefined behaviour). cela depend donc de ta plateforme: traditionnellement on dit que ça peut aussi bien faire planter ton programme ou envoyer un virus par ton carnet d'adresse.
 
tu n'a pas besoin de ça. la norme définit dans float.h FLT_MAX. tu veux l'infini (standard IEEE754) ? c'est FLT_MAX+FLT_EPSILON, bref, tout ce qui est > à FLT_MAX.
 
le mieux c'est que tu te documentes sur sur l'IEEE754 et si tu veux tester des valeur, tu pourra le faire en hexa. mais gaffe au SIGFPE  ;)
 
 
http://archive.stsci.edu/fits/fits [...] 0000000000


Message édité par Taz le 08-01-2003 à 21:32:32
Reply

Marsh Posté le 08-01-2003 à 22:03:13    

merci je vais regarder ca de suite ... ca pourra m aider pour les algos de recherche de chemin ...

Reply

Marsh Posté le 08-01-2003 à 23:11:15    

xilebo a écrit :

merci je vais regarder ca de suite ... ca pourra m aider pour les algos de recherche de chemin ...


Tiens un petit coup de Dijkstra ...
sinon, concernant les nombres en virgule flotante, je prescris un petit Golberg : http://cch.loria.fr/documentation/ [...] ldberg.pdf
"What Every Computer Scientist Should Know About Floating-Point Arithmetic".
 
 
Je vais finir documentaliste moi !

Reply

Marsh Posté le 08-01-2003 à 23:42:16    

Par contre faut pas abuser des nombres qui valent Inf ou NaN, les processeurs sont pas prévus pour les manipuler aussi vite que les nombre valides (quand la levée d'exception du FPU est désactivée par défaut, c'est le cas sous linux/x86 mais pas sous OSF par ex.). Bref ce que je voulais dire au début de ma phrase c'est que le calcul de Inf+Inf peut etre 100 fois plus lent que le calcul de 1+1

Reply

Marsh Posté le 09-01-2003 à 05:36:44    

nraynaud a écrit :

Je vais finir documentaliste moi !

N'hésites pas à t'exprimer dans la sous-catégorie bibliolinks !


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 09-01-2003 à 09:47:07    

ça marche pas sous Windows... avec quels compilos ?
parce qu'en C++Builder ça fonctionne très bien...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 09-01-2003 à 10:12:21    

euh ... Visual C++ 6.0, enfn j ai essayé vite  fait en fait.

Reply

Marsh Posté le 09-01-2003 à 10:13:40    

ouais mais VC++ quand tu fais :
 
for(int i .....)
{
 ....
}
for(int i .....)
{
 ....
}
 
il veut pas non plus :sarcastic: :whistle:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 09-01-2003 à 10:53:11    

euh ? ca depend des options de compilations ca ... perso je peux le faire (mais je le fais pas car c pas bieng)

Reply

Marsh Posté le 09-01-2003 à 10:53:11   

Reply

Marsh Posté le 09-01-2003 à 11:13:39    

xilebo a écrit :

(mais je le fais pas car c pas bieng)

:??:

Reply

Marsh Posté le 09-01-2003 à 11:22:15    

antp a écrit :

ouais mais VC++ quand tu fais :
 
for(int i .....)
{
 ....
}
for(int i .....)
{
 ....
}
 
il veut pas non plus :sarcastic: :whistle:  


 
:jap:
 
autant pour moi, j 'avais mal compris... effectivement en VC++, la portée de cette declaration est audessus du for donc si on met 2 for de suite avec une declaration int i dedans , il met une erreur variable already defined... C pour ca que je disais pas bien de declarer comme ca des variables dans le for car c apres on s y retrouve plus.
 
Par contre je ne savais pas que ct local au for avec d autres compilateurs....

Reply

Marsh Posté le 09-01-2003 à 11:38:30    

C'est la faute a Visual. La norme dit que la portee doit etre locale au for et c'est très pratique comme ça.

Reply

Sujets relatifs:

Leave a Replay

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