[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