Article View: es.comp.os.linux.programacion
Article #11237Re: [Novato] Problemas con if en C
From: Xavier Montero
Date: Mon, 17 Dec 2001 00:11
Date: Mon, 17 Dec 2001 00:11
82 lines
3761 bytes
3761 bytes
> �Mandeeeeee? ����C�mo va a ser *incorrecto* comparar variables del mismo
> tipo????
No es incorrecto sint�cticamente, pero puede dar errores como se ha
dicho en otros posts. Esto es debido a c�mo se representan las
cosas en coma flotante, y en seg�n que plataformas, puede que
ra�z de 49 no sea 7 sino 6.99999999999999 y eso da problemas
de igualdad exacta y absulta en las comparaciones. Mejor
usar:
double fabs(double x);
y para testear (a == b) aunque sint�cticamente correcto, mejor
poner (fabs(a - b) < 0.0000001) (o la precisi�n que se desee).
_Est�_ documentado oficialmente que la comparaci�n exacta
no da resultados correctos.
[2 minutos despu�s]
Mira, para demostrarlo he hecho un miniprograma en c, que compila
con "gcc -lm main.c"
-----------------------------
xavi@inspire:~/kk$ cat main.c
#include <stdio.h>
#include <math.h>
void main(void)
{
int i;
float j, k, l;
for (i = 0; i < 100; i++)
{
j = (float)i;
k = j * j * j;
l = pow( k, ( ((float)1) / 3 ) );
printf("%f, %f, %f\n", j, k, l);
}
}
xavi@inspire:~/kk$
-----------------------------
Lo que hago es un loop de 100 iteraciones, para cada iteraci�n
comvierto el contador "i" a flotante y lo meto en "j".
En "k" meto j al cubo. Y en "l" meto la ra�z c�bica de k, con
lo que l y j deber�an coincidir.
Os pongo las �ltimas l�neas de la salida en mi m�quina (en otra
plataforma con otro procesador podr�a variar si la representaci�n
de coma flotante se hiciera en otra combinaci�n exponente/mantisa):
-----------------------------
85.000000, 614125.000000, 85.000008
86.000000, 636056.000000, 86.000008
87.000000, 658503.000000, 87.000015
88.000000, 681472.000000, 88.000015
89.000000, 704969.000000, 89.000015
90.000000, 729000.000000, 90.000015
91.000000, 753571.000000, 91.000015
92.000000, 778688.000000, 92.000015
93.000000, 804357.000000, 93.000015
94.000000, 830584.000000, 94.000015
95.000000, 857375.000000, 95.000015
96.000000, 884736.000000, 96.000015
97.000000, 912673.000000, 97.000015
98.000000, 941192.000000, 98.000015
99.000000, 970299.000000, 99.000015
-----------------------------
As�, si te fijas, 99.000000 y 99.000015 _no_ son iguales y deber�an
serlo.
Lo he hecho con float en vez de double para que falle antes. Puede
que con double hubiera que elevar a 30 y sacar la raiz trig�sima
para ver el error, no lo se, pero en cualqueir caso el funcionamiento
es el mismo.
Saludos.
Xavi.
Technical Details
Message-ID:
<3C1D383C.FADA56B2@dsitelecom.com>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeeds.belnet.be!news.belnet.be!opentransit.net!newsfeed.comtenidos.com!newsfeeder.wanadoo.es!news.antakira.com!not-for-mailReferences:
<9vhmgg$oen$1@news.ya.com> <9vijpc$b52$1@news.wanadoo.es>Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: f86c8,68360ef397b8b55b X-Google-Attributes: gidf86c8,public X-Google-ArrivalTime: 2001-12-16 17:06:03 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!newsfeeds.belnet.be!news.belnet.be!opentransit.net!newsfeed.comtenidos.com!newsfeeder.wanadoo.es!news.antakira.com!not-for-mail From: Xavier Montero <xmontero@dsitelecom.com> Newsgroups: es.comp.os.linux.programacion Subject: Re: [Novato] Problemas con if en C Date: Mon, 17 Dec 2001 01:11:40 +0100 Organization: Digital Sound Items Lines: 82 Message-ID: <3C1D383C.FADA56B2@dsitelecom.com> References: <9vhmgg$oen$1@news.ya.com> <9vijpc$b52$1@news.wanadoo.es> NNTP-Posting-Host: 212.25.147.135 Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Trace: news.wanadoo.es 1008550562 4104 212.25.147.135 (17 Dec 2001 00:56:02 GMT) X-Complaints-To: usenet@wanadoo.es NNTP-Posting-Date: Mon, 17 Dec 2001 00:56:02 +0000 (UTC) X-Mailer: Mozilla 4.77 [en] (Windows NT 5.0; U) X-Accept-Language: en