NetBSD-Users archive

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

Re: NetBSD math asinf() Issue



> The code seems to be DTRT'ing. it runs 'return (x-x)/(x-x);' but ends up with
> 0. I did not see anything wrong in the assembly code either. Strange.
>
> christos

sorry, I have only an OpenBSD source tree (v 4.2) available.  In the source for
libm, there are two asinf routines, in w_asinf.c and e_asinf.c  w_* are wrappers
for ieee routines in e_*.   In the case of asinf(|x|>1), e_asinf.c
returns as you
say, (x-x)/(x-x), which should be NaN.  The wrapper in w_asinf.c, however,
munges this value,  quote:

/usr/src/lib/libm/src/w_asinf.c

float
asinf(float x)          /* wrapper asinf */
{
#ifdef _IEEE_LIBM
        return __ieee754_asinf(x);
#else
        float z;
        z = __ieee754_asinf(x);
        if(_LIB_VERSION == _IEEE_ || isnanf(x)) return z;
        if(fabsf(x)>(float)1.0) {
            /* asinf(|x|>1) */
            return (float)__kernel_standard((double)x,(double)x,102);
        } else
            return z;
#endif
}

in the usual case, it would return __kernel_standard stuff:  quote:

/usr/src/lib/libm/src/k_standard.c

  case 102:
                /* asin(|x|>1) */
                exc.type = DOMAIN;
                exc.name = type < 100 ? "asin" : "asinf";
                exc.retval = zero;
                if(_LIB_VERSION == _POSIX_)
                  errno = EDOM;
                else if (!matherr(&exc)) {
                  if(_LIB_VERSION == _SVID_) {
                        (void) WRITE2("asin: DOMAIN error\n", 19);
                  }
                  errno = EDOM;
                }
                break;

__kernel_standard_... returns exc.retval, here set to zero.

I assume that NetBSD uses a similar (or the same) scheme in libmath.

Dave
-- 
Caution, this account is hosted by gmail.
Strangers scan the content of all mail transiting such accounts.


Home | Main Index | Thread Index | Old Index