Article View: fr.comp.lang.c
Article #15412Re: virgule flottante et FLT_EPSILON
From: Didier Cassereau
Date: Tue, 27 Sep 2005 06:46
Date: Tue, 27 Sep 2005 06:46
65 lines
3337 bytes
3337 bytes
Tribulations Parall�les wrote:
> Bonjour � tous,
>
> Certains m'ont d�j� vu me soucier de FLT_EPSILON (dans float.h) sur d'autres
> forums ;-)
> En effet, en essayant le petit programme ci-dessous, on se rend compte que
> x=15, y=14. Afin de r�ellement obtenir 15, je rajoute FLT_EPSILON au
> num�rateur dans y.
> J'ai deux questions:
> 1- x et y me semblent identiques au premier abord. Que se passe-t-il de
> diff�rent dans ces deux cas? Pourquoi passer par des noms de variable
> semble changer la donne?
> 2- Quelle d�marche employer pour obtenir la bonne valeur? Rajouter au
> num�rateur FLT_EPSILON comme je l'ai fait constitue-t-il une bonne
> solution?
>
> Merci d'avance,
>
> Julien
>
> #include <stdio.h>
> #include <float.h>
>
> int main(void)
> {
> float t2=1.5, t1=0.0, h=0.1;
> int x=(1.5-0.0)/0.1;
> int y=(t2-t1)/h;
> int y_corrected=(t2-t1+FLT_EPSILON)/h;
> printf("x=%i, y=%i, y_corrected=%i\n",x,y,y_corrected);
>
> return 0;
> }
>
Bonjour,
Ce programme compil� sous Fedora Linux (gcc version 4.0.1 20050727)
donne 15 pour x et y, m�me sans correction par FLT_EPSILON !
(cc -o test test.c -Wall -Werror -O)
Idem avec gcc version 2.95.3 20010315 sous NetBSD.
Le m�me avec Microsoft Visual C++ v5.0 donne ce que tu dis, � savoir 14
pour y avant correction ... par contre tu r�cup�res des warnings � la
compilation, du style
Compiling...
test.c
z:\tmp\test\test.c(6) : warning C4305: 'initializing' : truncation from
'const double ' to 'float '
z:\tmp\test\test.c(7) : warning C4244: 'initializing' : conversion from
'const double ' to 'int ', possible loss of dataz:\tmp\test\test.c(8) :
warning C4244: 'initializing' : conversion from 'float ' to 'int ',
possible loss of data
z:\tmp\test\test.c(9) : warning C4244: 'initializing' : conversion from
'float ' to 'int ', possible loss of data
En fait, le calcul de x se fait en double puis conversion finale vers int.
Pour y le calcul se fait avec t1, t2 et h qui sont de type float, donc
le calcul se fait en float, puis conversion finale vers int.
D'o� la diff�rence de comportement ... mais qui est semble-t'il
compilateur d�pendante !
Amicalement
Technical Details
Message-ID:
<dhapt6$ghg$1@carbone.net.espci.fr>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news2.google.com!proxad.net!news.cs.univ-paris8.fr!jussieu.fr!news.espci.fr!not-for-mailReferences:
<43386482$0$26880$626a14ce@news.free.fr>Show Full Headers
Complete Article Headers
X-Google-Thread: f9822,309c5052b3bcc1bf X-Google-Attributes: gidf9822,public X-Google-Language: FRENCH,ASCII Path: arc1-ca.pugleaf.net!g2news1.google.com!news2.google.com!proxad.net!news.cs.univ-paris8.fr!jussieu.fr!news.espci.fr!not-for-mail From: Didier Cassereau <didier.cassereau.NOSPAM@espci.fr> Newsgroups: fr.comp.lang.c Subject: Re: virgule flottante et FLT_EPSILON Date: Tue, 27 Sep 2005 08:46:47 +0200 Organization: Ecole Superieure de Physique et de Chimie Industrielles Lines: 65 Message-ID: <dhapt6$ghg$1@carbone.net.espci.fr> References: <43386482$0$26880$626a14ce@news.free.fr> NNTP-Posting-Host: dc4u.loa.espci.fr Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-Trace: carbone.net.espci.fr 1127803622 16944 193.54.80.99 (27 Sep 2005 06:47:02 GMT) X-Complaints-To: newsmaster@espci.fr NNTP-Posting-Date: Tue, 27 Sep 2005 06:47:02 +0000 (UTC) User-Agent: Mozilla Thunderbird 1.0.6-1.1.fc4 (X11/20050720) X-Accept-Language: en-us, en In-Reply-To: <43386482$0$26880$626a14ce@news.free.fr>