NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
lib/42630: asin(2.0) and acos(2.0) doesn't return NaN
>Number: 42630
>Category: lib
>Synopsis: asin(2.0) and acos(2.0) doesn't return NaN
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: lib-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sun Jan 17 11:25:00 +0000 2010
>Originator: NARUSE, Yui
>Release: 5.0.1
>Organization:
>Environment:
NetBSD kelvena 5.0.1 NetBSD 5.0.1 (GENERIC) #0: Thu Jul 30 01:39:11 UTC 2009
builds%b8.netbsd.org@localhost:/home/builds/ab/netbsd-5-0-1-RELEASE/i386/200907292356Z-obj/home/builds/ab/netbsd-5-0-1-RELEASE/src/sys/arch/i386/compile/GENERIC
i386
>Description:
On NetBSD 5.0.1 (i386) asin(2.0) and acos(2.0) return 0.0.
(and set errno as EDOM)
This conflicts asin's man:
RETURN VALUES
If |x|>1, asin(x) and asinf(x) return NaN and set the global variable
errno to EDOM.
(acos's man doesn't descrive about return value if |x| > 1)
And lib/libm/src/e_asin.c's comment:
* Special cases:
* if x is NaN, return x itself;
* if |x|>1, return NaN with invalid signal.
(e_acos.c also has same comment)
This seems because of the bug of lib/libm/arch/i387/e_asin.S.
(and lib/libm/arch/i387/e_acos.S)
>How-To-Repeat:
$ cat t.c
#include <stdio.h>
#include <math.h>
#include <errno.h>
int main(void)
{
double r;
errno = 0;
r = asin(2.0);
printf("r: %f isnan:%d errno:%d\n", r, isnan(r), errno);
return 0;
}
$ cc -lm t.c
$ ./a.out
r: 0.000000 isnan:0 errno:33
>Fix:
Home |
Main Index |
Thread Index |
Old Index