[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Q]: ID analog to FORTRAN "sign" function




"Mark Hadfield" <m.hadfield@niwa.cri.nz> wrote in message
971127957.784431@clam-ext">news:971127957.784431@clam-ext...
> "Alex Schuster" <alex@pet.mpin-koeln.mpg.de> wrote in message
> 39E1C067.16F7488E@pet.mpin-koeln.mpg.de">news:39E1C067.16F7488E@pet.mpin-koeln.mpg.de...
> > Rostyslav Pavlichenko wrote:
> >
> > > Does the IDl have something close to Fortran SIGN (DSIGN... so on...)
> > > functions
> > > ...
> > > result = SIGN (a, b)
> > >         a  (Input) Must be of type integer or real.
> > >
> > >         b  Must have the same type and kind parameters as a.
> > >
> > > Results:
> > > =========
> > > The result type is the same as a.
> > > The value of the result is
> > > | a | if b >= zero
> > > and -| a | if b < zero.
> >>...
> > No, but you can easily write it:
> >
> > function sign, a, b
> >   if ( b ge 0 ) then $
> >     return, abs( a ) $
> >   else $
> >     return, -abs( a )
> > end
>
> The following is more compact and works when b is an array
>
>     return, abs(a) * (fix(b ge 0) - fix(b lt 0))

Do I dare offer one more? Subscript lookups seem faster than arithmetic
operations, making this one faster, more compact and no less cryptic! :-)

    Return, Abs(a) * ([-1, 1])[b GE 0]

A bit faster still, if you know the expected type of a and b, to avoid an
extra type conversion:

    Return, Abs(a) * ([-1.0, 1.0])[b GE 0]

or

    Return, Abs(a) * ([-1.0D, 1.0D])[b GE 0]

Cheers,
--
-Dick

Dick Jackson                     /         dick@d-jackson.com
D-Jackson Software Consulting   /    http://www.d-jackson.com
Calgary, Alberta, Canada       /   Voice/Fax: +1-403-242-7398