[Perl] Division sobre cero
Rodrigo Gallardo
lgallardo@computacion.cs.cinvestav.mx
23 Sep 2002 14:55:10 -0500
>>>>> "Gunnar" =3D=3D Gunnar Wolf <gwolf@campus.iztacala.unam.mx> writes:
>> x/0 m=E1s que undef dever=EDa ser NaN, NaN ya es manejado
>> correctamente por perl5 e incluso se podr=EDa, si el programador
>> tiene interes, atrapar la excepci=F3n y convertir el error en
>> NaN.
>>=20
>> Usar undef para ese caso, ser=EDa sobrecargarlo sin sentido, pues
>> la sem=E1ntica de undef est=E1 bien definida en operaciones
>> num=E9ricas (vale 0).
>>=20
>> Si alguien quiere usar NaN (y no por default, sino con una
>> bandera que 'auto-atienda' la excepci=F3n generada), no tengo
>> incovenientes.
> Suena muy apto... Aunque entiendo que x/0 no es formalmente un
> NaN - *ES* un n=FAmero (vamos, es un valor num=E9rico), pero
> indefinido. =BFMe equivoco?
Si, te equivocas. x/y se define como el n=FAmero que multiplicado por y
te da x. Si y =3D 0, ning=FAn n=FAmero tiene esa propiedad (a menos que x =
=3D
0, en cuyo caso *cualquier* n=FAmero la tiene). Normalmente en
matem=E1ticas se entiende entonces que x/0 no existe, es decir, no est=E1
definido. En ese sentido, es coherente decir que en perl x/0 =3D
undef. Pero tambi=E9n puedes tomar la posici=F3n de que x/0 si est=E1
definido. Pero como ning=FAn numero tiene la propiedad deseada, entonces
x/0 no es un n=FAmero. De ah=ED viene la idea del NaN. Por supuesto, NaN
se ver=E1 normalmente envuelto en expresiones que incluyen n=FAmeros, por
lo que es necesario definir como se comporta. En tal caso, es bastante
consistente decir que cualquier expresi=F3n que involucre NaN vale Nan.=20
La modificaci=F3n que propones pide que undef se comporte a veces como
NaN. Esto puede ser bueno a veces, por que en general la gente no
deber=EDa andar haciendo cuentas con undef de cualquier forma. Pero
rompe no solo con la tradici=F3n sino con la filosof=EDa de Perl, en la
que el lenguaje no se pone a decirte que eso que estas haciendo se ve
feo. Simplemente supone que si se lo pides es por que sabes lo que
haces.
Tienes dos broncas aqu=ED:=20
- Si undef a veces se porta como NaN, tienes que definir bien
cuando. =BFEs un comportamiento opcional? =BFComo se transmite? Por
ejemplo. Si tengo un undef-NaN y lo paso a una funci=F3n, y esta regresa
undef =BFese es un undef-NaN? =BFo un undef de los viejitos? =BFLo define la
funci=F3n misma? =BFel lenguaje? =BFalguna opci=F3n de compilaci=F3n?=20
- Si en vez de eso a=F1ades un nuevo valor NaN=B9 tienes que definir todo
su comportamiento. Tal como se define el de undef.
En general, la opci=F3n 1 es mas "perlosa", por que undef va a
comportarse a seg=FAn el contexto. La 2 es m=E1s segura, por que es m=E1s
dificil que muerda a alguien que viene de Perl 5. O de otros
lenguajes, donde se toma la ruta f=E1cil de que x/0 es un error y ya.
=B9 Si, es un valor nuevo. No importa que perl ya lo maneje en
flotantes. Se trata de que tambi=E9n lo haga en enteros. En flotantes lo
maneja s=F3lo por que la implementaci=F3n subyacente en C lo hace. Eso es
un accidente. Aqu=ED se le promover=EDa a un aut=E9ntico valor manejado por
Perl mismo.
--=20
Rodrigo
PGP key 1024D/ADC9BC28 2002-02-26 [expires 2004-02-26]
Fingerprint: 7C81 E60C 442E 8FBC D975 2F49 0199 8318 ADC9 BC28