C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Calcul avec l'infini

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Henri de Solages
Guest





PostPosted: Thu Mar 03, 2005 5:36 pm    Post subject: Calcul avec l'infini Reply with quote



Bonjour.

Si j'ai bien compris, la norme ISO/IEC 14882:2003 voudrait que les compilateurs lancent
une exception dès qu'il y a un dépassement de capacité lors d'une opération arithmétique,
ce qui est contraire à une norme IEEE plus ancienne qui prévoyait le calcul avec l'infini
(peut-être pour C ?).
Quelqu'un peut-il confirmer le caractère obligatoire de ce lancement d'exception ?

En pratique, je viens de constater que
ni icpc (compilateur d'Intel)
ni g++ (compilateur GNU), même avec l'option -pedantic
ne le font.

Avec ces deux compilateurs :
+ Sur un résultat nombre flottant, un overflow renvoie l'infini ("inf").
+ Sur un entier, c'est plus inquiétant car un dépassement vers plus l'infini renvoie
un entier négatif si l'entier n'est pas signé,
0 s'il n'est pas signé.

Quelqu'un connait-il une bibliothèque (avec sources) qui permette les calculs avec l'infini?
Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Mar 04, 2005 8:29 am    Post subject: Re: Calcul avec l'infini Reply with quote



Henri de Solages wrote:

Quote:
Si j'ai bien compris, la norme ISO/IEC 14882:2003 voudrait que
les compilateurs lancent une exception dès qu'il y a un
dépassement de capacité lors d'une opération arithmétique, ce
qui est contraire à une norme IEEE plus ancienne qui prévoyait
le calcul avec l'infini (peut-être pour C ?). Quelqu'un
peut-il confirmer le caractère obligatoire de ce lancement
d'exception ?

Je ne sais pas d'où tu as ces informations. Selon la norme, « If
during the evaluation of an expression, the result is not
mathematically defined or not in the range of representable
values for its type, the behavior is undefined, unless such an
expression is a constant expression, in which case the program
is ill-formed. » En gros, l'implémentation est libre de faire ce
que bon lui semble.

Note aussi que les opérateurs habituels n'ont pas les
définitions attendues sur des types entiers non-signés. Ou
plutôt, que l'abstraction des types entiers non-signés n'est pas
un intervale sur des cardinaux, comme on pourrait s'y attendre,
des nombres « modulo ». Du coup, quelque soit l'expression, le
resultat se trouve dans l'intervale représentable.

Quote:
En pratique, je viens de constater que
ni icpc (compilateur d'Intel)
ni g++ (compilateur GNU), même avec l'option -pedantic
ne le font.

Avec ces deux compilateurs :
+ Sur un résultat nombre flottant, un overflow renvoie
l'infini ("inf").

C'est un comportement indéfini selon la norme, mais du point de
vue qualité de l'implémentation, ça me semble un bon choix pour
les implémentations avec des flottants IEEE.

Quote:
+ Sur un entier, c'est plus inquiétant car un dépassement vers
plus l'infini renvoie un entier négatif si l'entier n'est pas
signé,

Pour les entiers signés, c'est encore un comportement indéfini.
Ici, le bon choix selon la qualité d'implémentation est moins
évident. Logiquement, dans l'absense d'un infini, on
s'attendrait à un signal, ou quelque chose du genre. Mais sur
des hardware courant, ça imposerait un coût supplémentaire non
negligeable en temps d'exécution. Historiquement, la solution
(en C et en C++) a toujours été de donner ce que le hardware
donne. Aujourd'hui, étant donné la prévalence des machines à
complément à deux, sans vérification automatique du débordement,
certains arguent même que c'est le comportement « attendu » --
c'est en tout cas le comportement exigé par Java. Et si c'est
vrai que personnellement, je préfère de loin de lever un signal,
si j'écrivais un compilateur, je ne manquerais pas d'offrir ce
comportement attendu, au moins en option.

Quote:
0 s'il n'est pas signé.

Encore, c'est selon. La norme exige que le programme se comporte
comme si 0 n'est pas signé, y compris pour les flottants.

Quote:
Quelqu'un connait-il une bibliothèque (avec sources) qui
permette les calculs avec l'infini?

Si ta machine supporte les flottants IEEE, c'est probable que tu
as des fonctions nécessaires déjà. C99 a ajouté une section
optionelle qui est peut-être supportée par ton compilateur C++ ;
sinon, il y a certainement du support non standard en extension.
Pour l'extension C, il suffit de tester si __STDC_IEC_559__ est
défini. Mais en général, si le hardware utilise IEEE, tu as les
calculs avec les infinités par défaut. (Parmi les machines
actuellement sur le marché, je crois que les IBM AS/400 et les
Unisys 2200 sont à peu près les seuls qui n'utilisent pas IEEE,
et les IBM le supporte aussi en option, même si ce n'est pas le
format par défaut.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
Henri de Solages
Guest





PostPosted: Fri Mar 04, 2005 12:03 pm    Post subject: Re: Calcul avec l'infini Reply with quote



Merci beaucoup.

[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:

Quote:
Je ne sais pas d'où tu as ces informations.

J'ai dû confondre avec le comportement attendu de new.

Quote:
En gros, l'implémentation est libre de faire ce
que bon lui semble.

Super pour la portabilité !

Quote:
Ou
plutôt, que l'abstraction des types entiers non-signés n'est pas
un intervale sur des cardinaux, comme on pourrait s'y attendre,
des nombres « modulo ».

Je ne comprends pas cette phrase.
Ne manque-t-il pas quelque chose avec << des nombres "modulo">>.

Quote:
+ Sur un entier, c'est plus inquiétant car un dépassement vers
plus l'infini renvoie un entier négatif si l'entier n'est pas
signé,
0 s'il n'est pas signé.

Encore, c'est selon. La norme exige que le programme se comporte
comme si 0 n'est pas signé, y compris pour les flottants.

Mon "il" ne remplaçait pas "0" mais "l'entier" :
si je fais
unsigned int grand = ... ;
unsigned int trop_grand = grand * grand ;
trop_grand vaudra 0 chez moi.
Si je comprends bien, ce comportement n'est pas normé non plus.

Quote:
Si ta machine supporte les flottants IEEE, c'est probable que tu
as des fonctions nécessaires déjà.

Mais uniquement pour les nombres flottant, n'est-ce pas ?
Et pour les entiers, existe-t-il une bibliothèque ?

Quote:
James Kanze GABI Software

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Mar 04, 2005 3:43 pm    Post subject: Re: Calcul avec l'infini Reply with quote

Henri de Solages wrote:

Quote:
kanze (AT) gabi-soft (DOT) fr wrote:

[...]
Quote:
En gros, l'implémentation est libre de faire ce que bon lui
semble.

Super pour la portabilité !

En gros, quand tu as affaire à des flottants, il n'y a pas de
portabilité. La raison, évidemment, c'est qu'on veut se baser
sur ce que fait le hardware (sinon, les performances risquent
d'en rendre l'utilisation impossible).

Quote:
Ou plutôt, que l'abstraction des types entiers non-signés
n'est pas un intervale sur des cardinaux, comme on pourrait
s'y attendre, des nombres « modulo ».

Je ne comprends pas cette phrase. Ne manque-t-il pas quelque
chose avec << des nombres "modulo">>.

Je ne crois pas, mais je ne suis pas particulièrement fort en
vocabulaire mathématique. L'abstraction derrière les types
entiers non-signés en C++, c'est l'arithmétique modulo ; si le
type a n bits significatifs, l'arithmétique sur le type se fait
modulo 2^n. Il ne peut donc jamais avoir un résultat qui n'est
pas représentable.

Quote:
+ Sur un entier, c'est plus inquiétant car un dépassement
vers plus l'infini renvoie un entier négatif si l'entier
n'est pas signé,

0 s'il n'est pas signé.

Encore, c'est selon. La norme exige que le programme se
comporte comme si 0 n'est pas signé, y compris pour les
flottants.

Mon "il" ne remplaçait pas "0" mais "l'entier" :
si je fais
unsigned int grand = ... ;
unsigned int trop_grand = grand * grand ;
trop_grand vaudra 0 chez moi.

Ça n'est pas normal. Il doit valoir le resultat réel modulo 2^n,
où n est le nombre de bits.

Note bien que si pour tester, tu prends des nombres du genre
0x80000000 (pour une machine de 32 bits), le résultat modulo
2^32 serait bien 0.

Quote:
Si je comprends bien, ce comportement n'est pas normé non
plus.

Le comportement des entiers non-signés est normé. Les autres
non.

Quote:
Si ta machine supporte les flottants IEEE, c'est probable
que tu as des fonctions nécessaires déjà.

Mais uniquement pour les nombres flottant, n'est-ce pas ? Et
pour les entiers, existe-t-il une bibliothèque ?

Pour les entiers, je ne connais pas de machine qui traite les
infinis. Ni de bibliothèque, d'ailleurs. Typiquement, quand on a
besoin des infinis, on a un problème mathématique, ce qui veut
dire des flottants.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
marc.boyer@enseeiht.yahoo
Guest





PostPosted: Mon Mar 07, 2005 12:24 pm    Post subject: Re: Calcul avec l'infini Reply with quote

Henri de Solages <solages (AT) CICT (DOT) FR> wrote in message
Quote:
Si ta machine supporte les flottants IEEE, c'est probable que tu
as des fonctions nécessaires déjà.

Mais uniquement pour les nombres flottant, n'est-ce pas ?
Et pour les entiers, existe-t-il une bibliothèque ?

On peut tout de même avec C++ faire "assez facilement" sa propre
gestion des entiers avec dépassement (à un cout CPU bien sur non
négligeable).

Sur ma page WEB, tu pourras trouver une classe qui provoque une
exception en cas de débordement. Il ne devrait pas être trop difficile
d'en faire une version qui particularise limits<T>::max() et
limits<T>:min() en +oo et -oo.

http://www.enseeiht.fr/~boyer/Tools.html

Marc Boyer

Back to top
Henri de Solages
Guest





PostPosted: Tue Mar 08, 2005 12:01 pm    Post subject: Re: Calcul avec l'infini Reply with quote

Merci beaucoup, mais il semble manquer au moins 2 fichiers dans ton package :
#include "CheckedNumeric.h"
#include "unitaryTests.hpp"


[email]marc.boyer (AT) enseeiht (DOT) yahoo.fr.inva[/email]lid del yahoo wrote:
Quote:
Sur ma page WEB, tu pourras trouver une classe qui provoque une
exception en cas de débordement. Il ne devrait pas être trop difficile
d'en faire une version qui particularise limits<T>::max() et
limits<T>:min() en +oo et -oo.

http://www.enseeiht.fr/~boyer/Tools.html

Marc Boyer

Back to top
marc.boyer@enseeiht.yahoo
Guest





PostPosted: Fri Mar 11, 2005 12:39 pm    Post subject: Re: Calcul avec l'infini Reply with quote

Henri de Solages <solages (AT) CICT (DOT) fr_> wrote

Quote:
Merci beaucoup, mais il semble manquer au moins 2 fichiers dans ton package :
#include "CheckedNumeric.h"
#include "unitaryTests.hpp"

Il manquait même beaucoup plus.
Mais ça devrait etre nettement mieux maintenant.

Marc Boyer

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.