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