mirror of
https://git.FreeBSD.org/src.git
synced 2024-10-19 02:29:40 +00:00
Fix two bugs in the signbit() macro, which was implemented last year:
- It was added to libc instead of libm. Hopefully no programs rely on this mistake. - It didn't work properly on large long doubles because its argument was converted to type double, resulting in undefined behavior.
This commit is contained in:
parent
e370e911b2
commit
ec79bc0da9
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=132382
@ -25,8 +25,7 @@ SRCS+= __xuname.c _pthread_stubs.c _rand48.c _spinlock_stub.c _thread_init.c \
|
||||
raise.c readdir.c readpassphrase.c rewinddir.c \
|
||||
scandir.c seed48.c seekdir.c sem.c semctl.c \
|
||||
setdomainname.c sethostname.c setjmperr.c setmode.c \
|
||||
setproctitle.c setprogname.c \
|
||||
siginterrupt.c siglist.c signal.c signbit.c \
|
||||
setproctitle.c setprogname.c siginterrupt.c siglist.c signal.c \
|
||||
sigsetops.c sleep.c srand48.c statvfs.c stringlist.c strtofflags.c \
|
||||
sysconf.c sysctl.c sysctlbyname.c sysctlnametomib.c \
|
||||
syslog.c telldir.c termios.c time.c times.c timezone.c ttyname.c \
|
||||
@ -57,7 +56,7 @@ MAN+= alarm.3 arc4random.3 \
|
||||
scandir.3 sem_destroy.3 sem_getvalue.3 sem_init.3 \
|
||||
sem_open.3 sem_post.3 sem_wait.3 \
|
||||
setjmp.3 setmode.3 setproctitle.3 shm_open.3 \
|
||||
siginterrupt.3 signal.3 signbit.3 sigsetops.3 sleep.3 \
|
||||
siginterrupt.3 signal.3 sigsetops.3 sleep.3 \
|
||||
statvfs.3 stringlist.3 \
|
||||
strtofflags.3 sysconf.3 sysctl.3 syslog.3 tcgetpgrp.3 \
|
||||
tcsendbreak.3 tcsetattr.3 tcsetpgrp.3 time.3 times.3 timezone.3 \
|
||||
|
@ -89,7 +89,7 @@ COMMON_SRCS= b_exp.c b_log.c b_tgamma.c \
|
||||
s_log1pf.c s_logb.c s_logbf.c s_matherr.c s_modff.c \
|
||||
s_nearbyint.c s_nextafter.c s_nextafterf.c \
|
||||
s_rint.c s_rintf.c s_round.c s_roundf.c \
|
||||
s_scalbln.c s_scalbn.c s_scalbnf.c \
|
||||
s_scalbln.c s_scalbn.c s_scalbnf.c s_signbit.c \
|
||||
s_signgam.c s_significand.c s_significandf.c s_sin.c s_sinf.c s_tan.c \
|
||||
s_tanf.c s_tanh.c s_tanhf.c s_trunc.c s_truncf.c \
|
||||
w_acos.c w_acosf.c w_acosh.c w_acoshf.c w_asin.c w_asinf.c w_atan2.c \
|
||||
@ -131,8 +131,8 @@ INCS= fenv.h math.h
|
||||
MAN= acos.3 acosh.3 asin.3 asinh.3 atan.3 atan2.3 atanh.3 ceil.3 \
|
||||
cos.3 cosh.3 erf.3 exp.3 fabs.3 fdim.3 feclearexcept.3 fegetenv.3 \
|
||||
fegetround.3 fenv.3 floor.3 fmax.3 fmod.3 hypot.3 ieee.3 \
|
||||
ieee_test.3 j0.3 lgamma.3 math.3 rint.3 round.3 sin.3 sinh.3 sqrt.3 \
|
||||
tan.3 tanh.3 trunc.3
|
||||
ieee_test.3 j0.3 lgamma.3 math.3 rint.3 round.3 \
|
||||
signbit.3 sin.3 sinh.3 sqrt.3 tan.3 tanh.3 trunc.3
|
||||
|
||||
MLINKS+=acos.3 acosf.3
|
||||
MLINKS+=acosh.3 acoshf.3
|
||||
|
@ -24,14 +24,14 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd February 11, 2003
|
||||
.Dd July 18, 2004
|
||||
.Dt SIGNBIT 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm signbit
|
||||
.Nd "determine whether a floating-point number's sign is negative"
|
||||
.Sh LIBRARY
|
||||
.Lb libc
|
||||
.Lb libm
|
||||
.Sh SYNOPSIS
|
||||
.In math.h
|
||||
.Ft int
|
@ -113,7 +113,10 @@ extern const union __nan_un {
|
||||
#define isunordered(x, y) (isnan(x) || isnan(y))
|
||||
#endif /* __MATH_BUILTIN_RELOPS */
|
||||
|
||||
#define signbit(x) __signbit(x)
|
||||
#define signbit(x) \
|
||||
((sizeof (x) == sizeof (float)) ? __signbitf(x) \
|
||||
: (sizeof (x) == sizeof (double)) ? __signbit(x) \
|
||||
: __signbitl(x))
|
||||
|
||||
typedef __double_t double_t;
|
||||
typedef __float_t float_t;
|
||||
@ -215,6 +218,8 @@ int __isnormalf(float) __pure2;
|
||||
int __isnormal(double) __pure2;
|
||||
int __isnormall(long double) __pure2;
|
||||
int __signbit(double) __pure2;
|
||||
int __signbitf(float) __pure2;
|
||||
int __signbitl(long double) __pure2;
|
||||
|
||||
double acos(double);
|
||||
double asin(double);
|
||||
|
@ -38,3 +38,21 @@ __signbit(double d)
|
||||
u.d = d;
|
||||
return (u.bits.sign);
|
||||
}
|
||||
|
||||
int
|
||||
__signbitf(float f)
|
||||
{
|
||||
union IEEEf2bits u;
|
||||
|
||||
u.f = f;
|
||||
return (u.bits.sign);
|
||||
}
|
||||
|
||||
int
|
||||
__signbitl(long double e)
|
||||
{
|
||||
union IEEEl2bits u;
|
||||
|
||||
u.e = e;
|
||||
return (u.bits.sign);
|
||||
}
|
Loading…
Reference in New Issue
Block a user