mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-30 00:08:30 +00:00
Perform some code cleanup
This commit is contained in:
parent
cc1732bc42
commit
210187cf77
205 changed files with 1748 additions and 2595 deletions
|
@ -31,7 +31,7 @@ asm(".ident\t\"\\n\\n\
|
|||
Musl libc (MIT License)\\n\
|
||||
Copyright 2005-2014 Rich Felker, et. al.\"");
|
||||
asm(".include \"libc/disclaimer.inc\"");
|
||||
/* clang-format off */
|
||||
// clang-format off
|
||||
|
||||
/* origin: FreeBSD /usr/src/lib/msun/src/e_asin.c */
|
||||
/*
|
||||
|
@ -147,3 +147,7 @@ double asin(double x)
|
|||
}
|
||||
return ng ? -x : x;
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(asin, asinl);
|
||||
#endif
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "libc/tinymath/internal.h"
|
||||
#include "libc/tinymath/invtrigl.internal.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
fdlibm (fdlibm license)\\n\
|
||||
|
@ -55,16 +56,6 @@ asm(".include \"libc/disclaimer.inc\"");
|
|||
* Converted to long double by David Schultz <das@FreeBSD.ORG>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Returns arc sine of 𝑥.
|
||||
*
|
||||
* @define atan2(𝑥,sqrt((1-𝑥)*(1+𝑥)))
|
||||
* @domain -1 ≤ 𝑥 ≤ 1
|
||||
*/
|
||||
long double asinl(long double x) {
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return asin(x);
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
#if LDBL_MANT_DIG == 64
|
||||
#define CLOSETO1(u) (u.i.m>>56 >= 0xf7)
|
||||
#define CLEARBOTTOM(u) (u.i.m &= -1ULL << 32)
|
||||
|
@ -73,6 +64,14 @@ long double asinl(long double x) {
|
|||
#define CLEARBOTTOM(u) (u.i.lo = 0)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Returns arc sine of 𝑥.
|
||||
*
|
||||
* @define atan2(𝑥,sqrt((1-𝑥)*(1+𝑥)))
|
||||
* @domain -1 ≤ 𝑥 ≤ 1
|
||||
*/
|
||||
long double asinl(long double x)
|
||||
{
|
||||
union ldshape u = {x};
|
||||
long double z, r, s;
|
||||
uint16_t e = u.i.se & 0x7fff;
|
||||
|
@ -108,7 +107,6 @@ long double asinl(long double x) {
|
|||
}
|
||||
return sign ? -x : x;
|
||||
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -154,3 +154,7 @@ double atan(double x)
|
|||
z = atanhi[id] - (x*(s1+s2) - atanlo[id] - x);
|
||||
return sign ? -z : z;
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(atan, atanl);
|
||||
#endif
|
||||
|
|
|
@ -153,3 +153,7 @@ atan2(double y, double x)
|
|||
return (z-pi_lo)-pi;/* atan(-,-) */
|
||||
}
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(atan2, atan2l);
|
||||
#endif
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "libc/tinymath/internal.h"
|
||||
#include "libc/tinymath/invtrigl.internal.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
fdlibm (fdlibm license)\\n\
|
||||
|
@ -69,11 +70,7 @@ long double atan2l(long double y, long double x)
|
|||
: "st(1)");
|
||||
return x;
|
||||
|
||||
#elif LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
|
||||
return atan2(y, x);
|
||||
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
#else
|
||||
|
||||
union ldshape ux, uy;
|
||||
long double z;
|
||||
|
@ -130,7 +127,7 @@ long double atan2l(long double y, long double x)
|
|||
return (z-2*pio2_lo)-2*pio2_hi; /* atan(-,-) */
|
||||
}
|
||||
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -32,7 +32,7 @@ asm(".ident\t\"\\n\\n\
|
|||
Musl libc (MIT License)\\n\
|
||||
Copyright 2005-2014 Rich Felker, et. al.\"");
|
||||
asm(".include \"libc/disclaimer.inc\"");
|
||||
/* clang-format off */
|
||||
// clang-format off
|
||||
|
||||
/**
|
||||
* Returns inverse hyperbolic tangent of 𝑥.
|
||||
|
@ -64,3 +64,7 @@ double atanh(double x)
|
|||
}
|
||||
return s ? -y : y;
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(atanh, atanhl);
|
||||
#endif
|
||||
|
|
|
@ -28,19 +28,13 @@
|
|||
#include "libc/math.h"
|
||||
#include "libc/tinymath/feval.internal.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
Copyright 2005-2014 Rich Felker, et. al.\"");
|
||||
asm(".include \"libc/disclaimer.inc\"");
|
||||
/* clang-format off */
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
long double atanhl(long double x)
|
||||
{
|
||||
return atanh(x);
|
||||
}
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
// clang-format off
|
||||
|
||||
/**
|
||||
* Returns inverse hyperbolic tangent of 𝑥.
|
||||
|
@ -72,6 +66,4 @@ long double atanhl(long double x)
|
|||
return s ? -x : x;
|
||||
}
|
||||
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "libc/math.h"
|
||||
#include "libc/tinymath/internal.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
fdlibm (fdlibm license)\\n\
|
||||
|
@ -54,13 +55,6 @@ asm(".include \"libc/disclaimer.inc\"");
|
|||
* Converted to long double by David Schultz <das@FreeBSD.ORG>.
|
||||
*/
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
long double atanl(long double x)
|
||||
{
|
||||
return atan(x);
|
||||
}
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
|
||||
#if LDBL_MANT_DIG == 64
|
||||
#define EXPMAN(u) ((u.i.se & 0x7fff)<<8 | (u.i.m>>55 & 0xff))
|
||||
|
||||
|
@ -231,6 +225,4 @@ long double atanl(long double x)
|
|||
return sign ? -z : z;
|
||||
}
|
||||
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -25,3 +25,7 @@
|
|||
double cabs(double complex z) {
|
||||
return hypot(creal(z), cimag(z));
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(cabs, cabsl);
|
||||
#endif
|
||||
|
|
|
@ -18,14 +18,13 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/complex.h"
|
||||
#include "libc/math.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
/**
|
||||
* Returns absolute value of complex number.
|
||||
*/
|
||||
long double cabsl(long double complex z) {
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return cabs(z);
|
||||
#else
|
||||
return hypotl(creall(z), cimagl(z));
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -22,3 +22,7 @@
|
|||
double carg(double complex z) {
|
||||
return atan2(cimag(z), creal(z));
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(carg, cargl);
|
||||
#endif
|
||||
|
|
|
@ -18,11 +18,10 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/complex.h"
|
||||
#include "libc/math.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
long double cargl(long double complex z) {
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return carg(z);
|
||||
#else
|
||||
return atan2l(cimagl(z), creall(z));
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -33,9 +33,7 @@ asm(".ident\t\"\\n\\n\
|
|||
Musl libc (MIT License)\\n\
|
||||
Copyright 2005-2014 Rich Felker, et. al.\"");
|
||||
asm(".include \"libc/disclaimer.inc\"");
|
||||
/* clang-format off */
|
||||
|
||||
|
||||
// clang-format off
|
||||
|
||||
// FIXME
|
||||
|
||||
|
@ -52,3 +50,7 @@ double complex casin(double complex z)
|
|||
double complex r = clog(CMPLX(-y, x) + csqrt(w));
|
||||
return CMPLX(cimag(r), -creal(r));
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(casin, casinl);
|
||||
#endif
|
||||
|
|
|
@ -26,18 +26,16 @@
|
|||
│ │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/complex.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
Copyright 2005-2014 Rich Felker, et. al.\"");
|
||||
asm(".include \"libc/disclaimer.inc\"");
|
||||
/* clang-format off */
|
||||
// clang-format off
|
||||
|
||||
long double complex casinl(long double complex z) {
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return casin(z);
|
||||
#else
|
||||
// FIXME
|
||||
long double complex casinl(long double complex z)
|
||||
{
|
||||
long double complex w;
|
||||
long double x, y;
|
||||
x = creall(z);
|
||||
|
@ -45,5 +43,6 @@ long double complex casinl(long double complex z) {
|
|||
w = CMPLXL(1.0 - (x - y)*(x + y), -2.0*x*y);
|
||||
long double complex r = clogl(CMPLXL(-y, x) + csqrtl(w));
|
||||
return CMPLXL(cimagl(r), -creall(r));
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -36,7 +36,7 @@ asm(".ident\t\"\\n\\n\
|
|||
Musl libc (MIT License)\\n\
|
||||
Copyright 2005-2014 Rich Felker, et. al.\"");
|
||||
asm(".include \"libc/disclaimer.inc\"");
|
||||
/* clang-format off */
|
||||
// clang-format off
|
||||
|
||||
|
||||
/* origin: OpenBSD /usr/src/lib/libm/src/s_catan.c */
|
||||
|
|
|
@ -1,45 +1,24 @@
|
|||
/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│
|
||||
╚──────────────────────────────────────────────────────────────────────────────╝
|
||||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2023 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Musl Libc │
|
||||
│ Copyright © 2005-2014 Rich Felker, et al. │
|
||||
│ │
|
||||
│ Permission is hereby granted, free of charge, to any person obtaining │
|
||||
│ a copy of this software and associated documentation files (the │
|
||||
│ "Software"), to deal in the Software without restriction, including │
|
||||
│ without limitation the rights to use, copy, modify, merge, publish, │
|
||||
│ distribute, sublicense, and/or sell copies of the Software, and to │
|
||||
│ permit persons to whom the Software is furnished to do so, subject to │
|
||||
│ the following conditions: │
|
||||
│ │
|
||||
│ The above copyright notice and this permission notice shall be │
|
||||
│ included in all copies or substantial portions of the Software. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │
|
||||
│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │
|
||||
│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │
|
||||
│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │
|
||||
│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │
|
||||
│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │
|
||||
│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/complex.h"
|
||||
#include "libc/math.h"
|
||||
#include "libc/tinymath/complex.internal.h"
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
Copyright 2005-2014 Rich Felker, et. al.\"");
|
||||
asm(".include \"libc/disclaimer.inc\"");
|
||||
/* clang-format off */
|
||||
|
||||
|
||||
|
||||
/* cos(z) = cosh(i z) */
|
||||
|
||||
double complex ccos(double complex z)
|
||||
{
|
||||
return ccosh(CMPLX(-cimag(z), creal(z)));
|
||||
double complex ccos(double complex z) {
|
||||
return ccosh(CMPLX(-cimag(z), creal(z)));
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ asm(".ident\t\"\\n\\n\
|
|||
Musl libc (MIT License)\\n\
|
||||
Copyright 2005-2014 Rich Felker, et. al.\"");
|
||||
asm(".include \"libc/disclaimer.inc\"");
|
||||
/* clang-format off */
|
||||
// clang-format off
|
||||
|
||||
/* origin: FreeBSD /usr/src/lib/msun/src/s_cos.c */
|
||||
/*
|
||||
|
@ -120,3 +120,7 @@ double cos(double x)
|
|||
return __sin(y[0], y[1], 1);
|
||||
}
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(cos, cosl);
|
||||
#endif
|
||||
|
|
|
@ -33,7 +33,7 @@ asm(".ident\t\"\\n\\n\
|
|||
Musl libc (MIT License)\\n\
|
||||
Copyright 2005-2014 Rich Felker, et. al.\"");
|
||||
asm(".include \"libc/disclaimer.inc\"");
|
||||
/* clang-format off */
|
||||
// clang-format off
|
||||
|
||||
/**
|
||||
* Returns hyperbolic cosine of 𝑥.
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "libc/math.h"
|
||||
#include "libc/tinymath/kernel.internal.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
|
@ -41,9 +42,6 @@ asm(".include \"libc/disclaimer.inc\"");
|
|||
*/
|
||||
long double cosl(long double x)
|
||||
{
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return cos(x);
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
union ldshape u = {x};
|
||||
unsigned n;
|
||||
long double y[2], hi, lo;
|
||||
|
@ -72,7 +70,6 @@ long double cosl(long double x)
|
|||
default:
|
||||
return __sinl(hi, lo, 1);
|
||||
}
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -1,23 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2023 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
|
||||
double drem(double x, double y) {
|
||||
return remainder(x, y);
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2023 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
|
||||
float dremf(float x, float y) {
|
||||
return remainderf(x, y);
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2023 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
|
||||
long double dreml(long double x, long double y) {
|
||||
return remainderl(x, y);
|
||||
}
|
|
@ -168,3 +168,7 @@ double exp(double x)
|
|||
is no spurious underflow here even without fma. */
|
||||
return eval_as_double(scale + scale * tmp);
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(exp, expl);
|
||||
#endif
|
||||
|
|
|
@ -33,6 +33,9 @@ Copyright 2005-2014 Rich Felker, et. al.\"");
|
|||
asm(".include \"libc/disclaimer.inc\"");
|
||||
// clang-format off
|
||||
|
||||
/**
|
||||
* Returns 10ˣ.
|
||||
*/
|
||||
double exp10(double x)
|
||||
{
|
||||
static const double p10[] = {
|
||||
|
@ -51,3 +54,8 @@ double exp10(double x)
|
|||
}
|
||||
return pow(10.0, x);
|
||||
}
|
||||
|
||||
__strong_reference(exp10, pow10);
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(exp10, exp10l);
|
||||
#endif
|
||||
|
|
|
@ -33,6 +33,9 @@ Copyright 2005-2014 Rich Felker, et. al.\"");
|
|||
asm(".include \"libc/disclaimer.inc\"");
|
||||
// clang-format off
|
||||
|
||||
/**
|
||||
* Returns 10ˣ.
|
||||
*/
|
||||
float exp10f(float x)
|
||||
{
|
||||
static const float p10[] = {
|
||||
|
@ -49,3 +52,5 @@ float exp10f(float x)
|
|||
}
|
||||
return exp2(3.32192809488736234787031942948939 * x);
|
||||
}
|
||||
|
||||
__strong_reference(exp10f, pow10f);
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
|
@ -34,10 +35,11 @@ Copyright 2005-2014 Rich Felker, et. al.\"");
|
|||
asm(".include \"libc/disclaimer.inc\"");
|
||||
// clang-format off
|
||||
|
||||
long double exp10l(long double x) {
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return exp10(x);
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
/**
|
||||
* Returns 10ˣ.
|
||||
*/
|
||||
long double exp10l(long double x)
|
||||
{
|
||||
static const long double p10[] = {
|
||||
1e-15L, 1e-14L, 1e-13L, 1e-12L, 1e-11L, 1e-10L,
|
||||
1e-9L, 1e-8L, 1e-7L, 1e-6L, 1e-5L, 1e-4L, 1e-3L, 1e-2L, 1e-1L,
|
||||
|
@ -53,7 +55,8 @@ long double exp10l(long double x) {
|
|||
return y * p10[(int)n+15];
|
||||
}
|
||||
return powl(10.0, x);
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
__strong_reference(exp10l, pow10l);
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -155,3 +155,7 @@ double exp2(double x)
|
|||
is no spurious underflow here even without fma. */
|
||||
return eval_as_double(scale + scale * tmp);
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(exp2, exp2l);
|
||||
#endif
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "libc/math.h"
|
||||
#include "libc/tinymath/internal.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
FreeBSD libm (BSD-2 License)\\n\
|
||||
|
@ -65,12 +66,6 @@ asm(".include \"libc/disclaimer.inc\"");
|
|||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
long double exp2l(long double x)
|
||||
{
|
||||
return exp2(x);
|
||||
}
|
||||
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
#define TBLBITS 7
|
||||
#define TBLSIZE (1 << TBLBITS)
|
||||
|
||||
|
@ -235,6 +230,10 @@ static const double tbl[TBLSIZE * 2] = {
|
|||
* The table entries each have 104 bits of accuracy, encoded as
|
||||
* a pair of double precision values.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Returns 2^𝑥.
|
||||
*/
|
||||
long double exp2l(long double x)
|
||||
{
|
||||
union ldshape u = {x};
|
||||
|
@ -289,6 +288,7 @@ long double exp2l(long double x)
|
|||
|
||||
return scalbnl(r, k.i);
|
||||
}
|
||||
|
||||
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
|
||||
#define TBLBITS 7
|
||||
#define TBLSIZE (1 << TBLBITS)
|
||||
|
@ -600,6 +600,10 @@ static const float eps[TBLSIZE] = {
|
|||
* Gal, S. and Bachelis, B. An Accurate Elementary Mathematical Library
|
||||
* for the IEEE Floating Point Standard. TOMS 17(1), 26-46 (1991).
|
||||
*/
|
||||
|
||||
/**
|
||||
* Returns 2^𝑥.
|
||||
*/
|
||||
long double
|
||||
exp2l(long double x)
|
||||
{
|
||||
|
@ -654,6 +658,5 @@ exp2l(long double x)
|
|||
|
||||
return scalbnl(r, k.i);
|
||||
}
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
|
||||
#endif
|
||||
|
|
|
@ -18,13 +18,7 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
|
||||
long double expl(long double x) {
|
||||
return exp(x);
|
||||
}
|
||||
|
||||
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
#if LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
#include "libc/tinymath/internal.h"
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
|
@ -120,6 +114,9 @@ LN2HI = 6.9314575195312500000000E-1L,
|
|||
LN2LO = 1.4286068203094172321215E-6L,
|
||||
LOG2E = 1.4426950408889634073599E0L;
|
||||
|
||||
/**
|
||||
* Returns 𝑒ˣ.
|
||||
*/
|
||||
long double expl(long double x)
|
||||
{
|
||||
long double px, xx;
|
||||
|
@ -211,6 +208,45 @@ o_threshold = 11356.523406294143949491931077970763428L,
|
|||
/* log(2**(-16381-64-1)) rounded towards zero: */
|
||||
u_threshold = -11433.462743336297878837243843452621503L;
|
||||
|
||||
static const double
|
||||
/*
|
||||
* ln2/INTERVALS = L1+L2 (hi+lo decomposition for multiplication). L1 must
|
||||
* have at least 22 (= log2(|LDBL_MIN_EXP-extras|) + log2(INTERVALS)) lowest
|
||||
* bits zero so that multiplication of it by n is exact.
|
||||
*/
|
||||
INV_L = 1.8466496523378731e+2, /* 0x171547652b82fe.0p-45 */
|
||||
L2 = -1.0253670638894731e-29; /* -0x1.9ff0342542fc3p-97 */
|
||||
static const long double
|
||||
/* 0x1.62e42fefa39ef35793c768000000p-8 */
|
||||
L1 = 5.41521234812457272982212595914567508e-3L;
|
||||
|
||||
/*
|
||||
* XXX values in hex in comments have been lost (or were never present)
|
||||
* from here.
|
||||
*/
|
||||
static const long double
|
||||
/*
|
||||
* Domain [-0.002708, 0.002708], range ~[-2.4021e-38, 2.4234e-38]:
|
||||
* |exp(x) - p(x)| < 2**-124.9
|
||||
* (0.002708 is ln2/(2*INTERVALS) rounded up a little).
|
||||
*
|
||||
* XXX the coeffs aren't very carefully rounded, and I get 3.6 more bits.
|
||||
*/
|
||||
A2 = 0.5,
|
||||
A3 = 1.66666666666666666666666666651085500e-1L,
|
||||
A4 = 4.16666666666666666666666666425885320e-2L,
|
||||
A5 = 8.33333333333333333334522877160175842e-3L,
|
||||
A6 = 1.38888888888888888889971139751596836e-3L;
|
||||
|
||||
static const double
|
||||
A7 = 1.9841269841269470e-4, /* 0x1.a01a01a019f91p-13 */
|
||||
A8 = 2.4801587301585286e-5, /* 0x1.71de3ec75a967p-19 */
|
||||
A9 = 2.7557324277411235e-6, /* 0x1.71de3ec75a967p-19 */
|
||||
A10 = 2.7557333722375069e-7; /* 0x1.27e505ab56259p-22 */
|
||||
|
||||
/**
|
||||
* Returns 𝑒ˣ.
|
||||
*/
|
||||
long double
|
||||
expl(long double x)
|
||||
{
|
||||
|
@ -354,6 +390,9 @@ D15 = 7.6478532249581686e-13, /* 0x1.ae892e3D16fcep-41 */
|
|||
D16 = 4.7628892832607741e-14, /* 0x1.ad00Dfe41feccp-45 */
|
||||
D17 = 3.0524857220358650e-15; /* 0x1.D7e8d886Df921p-49 */
|
||||
|
||||
/**
|
||||
* Returns 𝑒ˣ-1.
|
||||
*/
|
||||
long double
|
||||
expm1l(long double x)
|
||||
{
|
||||
|
@ -440,30 +479,30 @@ expm1l(long double x)
|
|||
|
||||
/*
|
||||
* Evaluate lower terms of
|
||||
* expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2).
|
||||
* expl(endpoint[n2] + r1 + r2) = kExplData[n2] * expl(r1 + r2).
|
||||
*/
|
||||
dr = r;
|
||||
q = r2 + r * r * (A2 + r * (A3 + r * (A4 + r * (A5 + r * (A6 +
|
||||
dr * (A7 + dr * (A8 + dr * (A9 + dr * A10))))))));
|
||||
|
||||
t = tbl[n2].lo + tbl[n2].hi;
|
||||
t = kExplData[n2].lo + kExplData[n2].hi;
|
||||
|
||||
if (k == 0) {
|
||||
t = SUM2P(tbl[n2].hi - 1, tbl[n2].lo * (r1 + 1) + t * q +
|
||||
tbl[n2].hi * r1);
|
||||
t = SUM2P(kExplData[n2].hi - 1, kExplData[n2].lo * (r1 + 1) + t * q +
|
||||
kExplData[n2].hi * r1);
|
||||
RETURNI(t);
|
||||
}
|
||||
if (k == -1) {
|
||||
t = SUM2P(tbl[n2].hi - 2, tbl[n2].lo * (r1 + 1) + t * q +
|
||||
tbl[n2].hi * r1);
|
||||
t = SUM2P(kExplData[n2].hi - 2, kExplData[n2].lo * (r1 + 1) + t * q +
|
||||
kExplData[n2].hi * r1);
|
||||
RETURNI(t / 2);
|
||||
}
|
||||
if (k < -7) {
|
||||
t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
|
||||
t = SUM2P(kExplData[n2].hi, kExplData[n2].lo + t * (q + r1));
|
||||
RETURNI(t * twopk - 1);
|
||||
}
|
||||
if (k > 2 * LDBL_MANT_DIG - 1) {
|
||||
t = SUM2P(tbl[n2].hi, tbl[n2].lo + t * (q + r1));
|
||||
t = SUM2P(kExplData[n2].hi, kExplData[n2].lo + t * (q + r1));
|
||||
if (k == LDBL_MAX_EXP)
|
||||
RETURNI(t * 2 * 0x1p16383L - 1);
|
||||
RETURNI(t * twopk - 1);
|
||||
|
@ -473,12 +512,10 @@ expm1l(long double x)
|
|||
twomk = v.e;
|
||||
|
||||
if (k > LDBL_MANT_DIG - 1)
|
||||
t = SUM2P(tbl[n2].hi, tbl[n2].lo - twomk + t * (q + r1));
|
||||
t = SUM2P(kExplData[n2].hi, kExplData[n2].lo - twomk + t * (q + r1));
|
||||
else
|
||||
t = SUM2P(tbl[n2].hi - twomk, tbl[n2].lo + t * (q + r1));
|
||||
t = SUM2P(kExplData[n2].hi - twomk, kExplData[n2].lo + t * (q + r1));
|
||||
RETURNI(t * twopk);
|
||||
}
|
||||
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
|
|
|
@ -236,3 +236,7 @@ double expm1(double x)
|
|||
y = (x-(e+u.f)+1)*twopk;
|
||||
return y;
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(expm1, expm1l);
|
||||
#endif
|
||||
|
|
|
@ -65,7 +65,7 @@ Q2 = 1.5807170421e-3; /* 0xcf3010.0p-33 */
|
|||
static volatile float huge = 1.0e+30;
|
||||
|
||||
/**
|
||||
* Returns 𝑒^𝑥-𝟷.
|
||||
* Returns 𝑒ˣ-1.
|
||||
*/
|
||||
float
|
||||
expm1f(float x)
|
||||
|
|
|
@ -1,14 +1,7 @@
|
|||
#include "libc/math.h"
|
||||
#include "libc/tinymath/internal.h"
|
||||
// clang-format off
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
|
||||
long double expm1l(long double x) {
|
||||
return expm1(x);
|
||||
}
|
||||
|
||||
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
OpenBSD libm (ISC License)\\n\
|
||||
|
@ -88,6 +81,9 @@ minarg = -4.5054566736396445112120088E1L,
|
|||
/* ln 2^16384 */
|
||||
maxarg = 1.1356523406294143949492E4L;
|
||||
|
||||
/**
|
||||
* Returns 𝑒ˣ-1.
|
||||
*/
|
||||
long double expm1l(long double x)
|
||||
{
|
||||
long double px, qx, xx;
|
||||
|
@ -124,10 +120,4 @@ long double expm1l(long double x)
|
|||
return x;
|
||||
}
|
||||
|
||||
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
|
||||
|
||||
// see expl.c
|
||||
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
│ │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#include "libc/tinymath/expo.internal.h"
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
|
|
|
@ -29,3 +29,7 @@ double fabs(double x) {
|
|||
u.i &= -1ULL / 2;
|
||||
return u.f;
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(fabs, fabsl);
|
||||
#endif
|
||||
|
|
|
@ -18,18 +18,15 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
/**
|
||||
* Returns absolute value of floating point number.
|
||||
*/
|
||||
long double fabsl(long double x) {
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return fabs(x);
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
union ldshape u = {x};
|
||||
u.i.se &= 0x7fff;
|
||||
return u.f;
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -25,3 +25,7 @@ double fdim(double x, double y) {
|
|||
if (isunordered(x, y)) return NAN;
|
||||
return x > y ? x - y : 0;
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(fdim, fdiml);
|
||||
#endif
|
||||
|
|
|
@ -17,15 +17,14 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
/**
|
||||
* Returns positive difference.
|
||||
*/
|
||||
long double fdiml(long double x, long double y) {
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return fdim(x, y);
|
||||
#else
|
||||
if (isunordered(x, y)) return NAN;
|
||||
return x > y ? x - y : 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -94,3 +94,7 @@ double floor(double x)
|
|||
|
||||
#endif /* __aarch64__ */
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(floor, floorl);
|
||||
#endif
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "libc/math.h"
|
||||
#include "libc/tinymath/internal.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
|
@ -40,11 +41,6 @@ asm(".include \"libc/disclaimer.inc\"");
|
|||
*/
|
||||
long double floorl(long double x)
|
||||
{
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
|
||||
return floor(x);
|
||||
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
static const long double toint = 1/LDBL_EPSILON;
|
||||
|
||||
union ldshape u = {x};
|
||||
|
@ -66,8 +62,6 @@ long double floorl(long double x)
|
|||
if (y > 0)
|
||||
return x + y - 1;
|
||||
return x + y;
|
||||
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -33,3 +33,7 @@ double fmin(double x, double y) {
|
|||
}
|
||||
return x < y ? x : y;
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(fmin, fminl);
|
||||
#endif
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
/**
|
||||
* Returns minimum of two long doubles.
|
||||
|
@ -33,3 +34,5 @@ long double fminl(long double x, long double y) {
|
|||
}
|
||||
return x < y ? x : y;
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -944,54 +944,11 @@ long double __kernel_sinl(long double, long double, int);
|
|||
long double __kernel_cosl(long double, long double);
|
||||
long double __kernel_tanl(long double, long double, int);
|
||||
|
||||
/*
|
||||
* ld128 version of k_expl.h. See ../ld80/s_expl.c for most comments.
|
||||
*
|
||||
* See ../src/e_exp.c and ../src/k_exp.h for precision-independent comments
|
||||
* about the secondary kernels.
|
||||
*/
|
||||
|
||||
#define INTERVALS 128
|
||||
#define LOG2_INTERVALS 7
|
||||
#define BIAS (LDBL_MAX_EXP - 1)
|
||||
#define BIAS (LDBL_MAX_EXP - 1)
|
||||
|
||||
static const double
|
||||
/*
|
||||
* ln2/INTERVALS = L1+L2 (hi+lo decomposition for multiplication). L1 must
|
||||
* have at least 22 (= log2(|LDBL_MIN_EXP-extras|) + log2(INTERVALS)) lowest
|
||||
* bits zero so that multiplication of it by n is exact.
|
||||
*/
|
||||
INV_L = 1.8466496523378731e+2, /* 0x171547652b82fe.0p-45 */
|
||||
L2 = -1.0253670638894731e-29; /* -0x1.9ff0342542fc3p-97 */
|
||||
static const long double
|
||||
/* 0x1.62e42fefa39ef35793c768000000p-8 */
|
||||
L1 = 5.41521234812457272982212595914567508e-3L;
|
||||
|
||||
/*
|
||||
* XXX values in hex in comments have been lost (or were never present)
|
||||
* from here.
|
||||
*/
|
||||
static const long double
|
||||
/*
|
||||
* Domain [-0.002708, 0.002708], range ~[-2.4021e-38, 2.4234e-38]:
|
||||
* |exp(x) - p(x)| < 2**-124.9
|
||||
* (0.002708 is ln2/(2*INTERVALS) rounded up a little).
|
||||
*
|
||||
* XXX the coeffs aren't very carefully rounded, and I get 3.6 more bits.
|
||||
*/
|
||||
A2 = 0.5,
|
||||
A3 = 1.66666666666666666666666666651085500e-1L,
|
||||
A4 = 4.16666666666666666666666666425885320e-2L,
|
||||
A5 = 8.33333333333333333334522877160175842e-3L,
|
||||
A6 = 1.38888888888888888889971139751596836e-3L;
|
||||
|
||||
static const double
|
||||
A7 = 1.9841269841269470e-4, /* 0x1.a01a01a019f91p-13 */
|
||||
A8 = 2.4801587301585286e-5, /* 0x1.71de3ec75a967p-19 */
|
||||
A9 = 2.7557324277411235e-6, /* 0x1.71de3ec75a967p-19 */
|
||||
A10 = 2.7557333722375069e-7; /* 0x1.27e505ab56259p-22 */
|
||||
|
||||
static const struct {
|
||||
struct ExplData {
|
||||
/*
|
||||
* hi must be rounded to at most 106 bits so that multiplication
|
||||
* by r1 in expm1l() is exact, but it is rounded to 88 bits due to
|
||||
|
@ -1011,167 +968,11 @@ static const struct {
|
|||
*/
|
||||
long double hi;
|
||||
long double lo;
|
||||
} tbl[INTERVALS] = {
|
||||
{0x1p0L, 0x0p0L},
|
||||
{0x1.0163da9fb33356d84a66aep0L, 0x3.36dcdfa4003ec04c360be2404078p-92L},
|
||||
{0x1.02c9a3e778060ee6f7cacap0L, 0x4.f7a29bde93d70a2cabc5cb89ba10p-92L},
|
||||
{0x1.04315e86e7f84bd738f9a2p0L, 0xd.a47e6ed040bb4bfc05af6455e9b8p-96L},
|
||||
{0x1.059b0d31585743ae7c548ep0L, 0xb.68ca417fe53e3495f7df4baf84a0p-92L},
|
||||
{0x1.0706b29ddf6ddc6dc403a8p0L, 0x1.d87b27ed07cb8b092ac75e311753p-88L},
|
||||
{0x1.0874518759bc808c35f25cp0L, 0x1.9427fa2b041b2d6829d8993a0d01p-88L},
|
||||
{0x1.09e3ecac6f3834521e060cp0L, 0x5.84d6b74ba2e023da730e7fccb758p-92L},
|
||||
{0x1.0b5586cf9890f6298b92b6p0L, 0x1.1842a98364291408b3ceb0a2a2bbp-88L},
|
||||
{0x1.0cc922b7247f7407b705b8p0L, 0x9.3dc5e8aac564e6fe2ef1d431fd98p-92L},
|
||||
{0x1.0e3ec32d3d1a2020742e4ep0L, 0x1.8af6a552ac4b358b1129e9f966a4p-88L},
|
||||
{0x1.0fb66affed31af232091dcp0L, 0x1.8a1426514e0b627bda694a400a27p-88L},
|
||||
{0x1.11301d0125b50a4ebbf1aep0L, 0xd.9318ceac5cc47ab166ee57427178p-92L},
|
||||
{0x1.12abdc06c31cbfb92bad32p0L, 0x4.d68e2f7270bdf7cedf94eb1cb818p-92L},
|
||||
{0x1.1429aaea92ddfb34101942p0L, 0x1.b2586d01844b389bea7aedd221d4p-88L},
|
||||
{0x1.15a98c8a58e512480d573cp0L, 0x1.d5613bf92a2b618ee31b376c2689p-88L},
|
||||
{0x1.172b83c7d517adcdf7c8c4p0L, 0x1.0eb14a792035509ff7d758693f24p-88L},
|
||||
{0x1.18af9388c8de9bbbf70b9ap0L, 0x3.c2505c97c0102e5f1211941d2840p-92L},
|
||||
{0x1.1a35beb6fcb753cb698f68p0L, 0x1.2d1c835a6c30724d5cfae31b84e5p-88L},
|
||||
{0x1.1bbe084045cd39ab1e72b4p0L, 0x4.27e35f9acb57e473915519a1b448p-92L},
|
||||
{0x1.1d4873168b9aa7805b8028p0L, 0x9.90f07a98b42206e46166cf051d70p-92L},
|
||||
{0x1.1ed5022fcd91cb8819ff60p0L, 0x1.121d1e504d36c47474c9b7de6067p-88L},
|
||||
{0x1.2063b88628cd63b8eeb028p0L, 0x1.50929d0fc487d21c2b84004264dep-88L},
|
||||
{0x1.21f49917ddc962552fd292p0L, 0x9.4bdb4b61ea62477caa1dce823ba0p-92L},
|
||||
{0x1.2387a6e75623866c1fadb0p0L, 0x1.c15cb593b0328566902df69e4de2p-88L},
|
||||
{0x1.251ce4fb2a63f3582ab7dep0L, 0x9.e94811a9c8afdcf796934bc652d0p-92L},
|
||||
{0x1.26b4565e27cdd257a67328p0L, 0x1.d3b249dce4e9186ddd5ff44e6b08p-92L},
|
||||
{0x1.284dfe1f5638096cf15cf0p0L, 0x3.ca0967fdaa2e52d7c8106f2e262cp-92L},
|
||||
{0x1.29e9df51fdee12c25d15f4p0L, 0x1.a24aa3bca890ac08d203fed80a07p-88L},
|
||||
{0x1.2b87fd0dad98ffddea4652p0L, 0x1.8fcab88442fdc3cb6de4519165edp-88L},
|
||||
{0x1.2d285a6e4030b40091d536p0L, 0xd.075384589c1cd1b3e4018a6b1348p-92L},
|
||||
{0x1.2ecafa93e2f5611ca0f45cp0L, 0x1.523833af611bdcda253c554cf278p-88L},
|
||||
{0x1.306fe0a31b7152de8d5a46p0L, 0x3.05c85edecbc27343629f502f1af2p-92L},
|
||||
{0x1.32170fc4cd8313539cf1c2p0L, 0x1.008f86dde3220ae17a005b6412bep-88L},
|
||||
{0x1.33c08b26416ff4c9c8610cp0L, 0x1.96696bf95d1593039539d94d662bp-88L},
|
||||
{0x1.356c55f929ff0c94623476p0L, 0x3.73af38d6d8d6f9506c9bbc93cbc0p-92L},
|
||||
{0x1.371a7373aa9caa7145502ep0L, 0x1.4547987e3e12516bf9c699be432fp-88L},
|
||||
{0x1.38cae6d05d86585a9cb0d8p0L, 0x1.bed0c853bd30a02790931eb2e8f0p-88L},
|
||||
{0x1.3a7db34e59ff6ea1bc9298p0L, 0x1.e0a1d336163fe2f852ceeb134067p-88L},
|
||||
{0x1.3c32dc313a8e484001f228p0L, 0xb.58f3775e06ab66353001fae9fca0p-92L},
|
||||
{0x1.3dea64c12342235b41223ep0L, 0x1.3d773fba2cb82b8244267c54443fp-92L},
|
||||
{0x1.3fa4504ac801ba0bf701aap0L, 0x4.1832fb8c1c8dbdff2c49909e6c60p-92L},
|
||||
{0x1.4160a21f72e29f84325b8ep0L, 0x1.3db61fb352f0540e6ba05634413ep-88L},
|
||||
{0x1.431f5d950a896dc7044394p0L, 0x1.0ccec81e24b0caff7581ef4127f7p-92L},
|
||||
{0x1.44e086061892d03136f408p0L, 0x1.df019fbd4f3b48709b78591d5cb5p-88L},
|
||||
{0x1.46a41ed1d005772512f458p0L, 0x1.229d97df404ff21f39c1b594d3a8p-88L},
|
||||
{0x1.486a2b5c13cd013c1a3b68p0L, 0x1.062f03c3dd75ce8757f780e6ec99p-88L},
|
||||
{0x1.4a32af0d7d3de672d8bcf4p0L, 0x6.f9586461db1d878b1d148bd3ccb8p-92L},
|
||||
{0x1.4bfdad5362a271d4397afep0L, 0xc.42e20e0363ba2e159c579f82e4b0p-92L},
|
||||
{0x1.4dcb299fddd0d63b36ef1ap0L, 0x9.e0cc484b25a5566d0bd5f58ad238p-92L},
|
||||
{0x1.4f9b2769d2ca6ad33d8b68p0L, 0x1.aa073ee55e028497a329a7333dbap-88L},
|
||||
{0x1.516daa2cf6641c112f52c8p0L, 0x4.d822190e718226177d7608d20038p-92L},
|
||||
{0x1.5342b569d4f81df0a83c48p0L, 0x1.d86a63f4e672a3e429805b049465p-88L},
|
||||
{0x1.551a4ca5d920ec52ec6202p0L, 0x4.34ca672645dc6c124d6619a87574p-92L},
|
||||
{0x1.56f4736b527da66ecb0046p0L, 0x1.64eb3c00f2f5ab3d801d7cc7272dp-88L},
|
||||
{0x1.58d12d497c7fd252bc2b72p0L, 0x1.43bcf2ec936a970d9cc266f0072fp-88L},
|
||||
{0x1.5ab07dd48542958c930150p0L, 0x1.91eb345d88d7c81280e069fbdb63p-88L},
|
||||
{0x1.5c9268a5946b701c4b1b80p0L, 0x1.6986a203d84e6a4a92f179e71889p-88L},
|
||||
{0x1.5e76f15ad21486e9be4c20p0L, 0x3.99766a06548a05829e853bdb2b52p-92L},
|
||||
{0x1.605e1b976dc08b076f592ap0L, 0x4.86e3b34ead1b4769df867b9c89ccp-92L},
|
||||
{0x1.6247eb03a5584b1f0fa06ep0L, 0x1.d2da42bb1ceaf9f732275b8aef30p-88L},
|
||||
{0x1.6434634ccc31fc76f8714cp0L, 0x4.ed9a4e41000307103a18cf7a6e08p-92L},
|
||||
{0x1.66238825522249127d9e28p0L, 0x1.b8f314a337f4dc0a3adf1787ff74p-88L},
|
||||
{0x1.68155d44ca973081c57226p0L, 0x1.b9f32706bfe4e627d809a85dcc66p-88L},
|
||||
{0x1.6a09e667f3bcc908b2fb12p0L, 0x1.66ea957d3e3adec17512775099dap-88L},
|
||||
{0x1.6c012750bdabeed76a9980p0L, 0xf.4f33fdeb8b0ecd831106f57b3d00p-96L},
|
||||
{0x1.6dfb23c651a2ef220e2cbep0L, 0x1.bbaa834b3f11577ceefbe6c1c411p-92L},
|
||||
{0x1.6ff7df9519483cf87e1b4ep0L, 0x1.3e213bff9b702d5aa477c12523cep-88L},
|
||||
{0x1.71f75e8ec5f73dd2370f2ep0L, 0xf.0acd6cb434b562d9e8a20adda648p-92L},
|
||||
{0x1.73f9a48a58173bd5c9a4e6p0L, 0x8.ab1182ae217f3a7681759553e840p-92L},
|
||||
{0x1.75feb564267c8bf6e9aa32p0L, 0x1.a48b27071805e61a17b954a2dad8p-88L},
|
||||
{0x1.780694fde5d3f619ae0280p0L, 0x8.58b2bb2bdcf86cd08e35fb04c0f0p-92L},
|
||||
{0x1.7a11473eb0186d7d51023ep0L, 0x1.6cda1f5ef42b66977960531e821bp-88L},
|
||||
{0x1.7c1ed0130c1327c4933444p0L, 0x1.937562b2dc933d44fc828efd4c9cp-88L},
|
||||
{0x1.7e2f336cf4e62105d02ba0p0L, 0x1.5797e170a1427f8fcdf5f3906108p-88L},
|
||||
{0x1.80427543e1a11b60de6764p0L, 0x9.a354ea706b8e4d8b718a672bf7c8p-92L},
|
||||
{0x1.82589994cce128acf88afap0L, 0xb.34a010f6ad65cbbac0f532d39be0p-92L},
|
||||
{0x1.8471a4623c7acce52f6b96p0L, 0x1.c64095370f51f48817914dd78665p-88L},
|
||||
{0x1.868d99b4492ec80e41d90ap0L, 0xc.251707484d73f136fb5779656b70p-92L},
|
||||
{0x1.88ac7d98a669966530bcdep0L, 0x1.2d4e9d61283ef385de170ab20f96p-88L},
|
||||
{0x1.8ace5422aa0db5ba7c55a0p0L, 0x1.92c9bb3e6ed61f2733304a346d8fp-88L},
|
||||
{0x1.8cf3216b5448bef2aa1cd0p0L, 0x1.61c55d84a9848f8c453b3ca8c946p-88L},
|
||||
{0x1.8f1ae991577362b982745cp0L, 0x7.2ed804efc9b4ae1458ae946099d4p-92L},
|
||||
{0x1.9145b0b91ffc588a61b468p0L, 0x1.f6b70e01c2a90229a4c4309ea719p-88L},
|
||||
{0x1.93737b0cdc5e4f4501c3f2p0L, 0x5.40a22d2fc4af581b63e8326efe9cp-92L},
|
||||
{0x1.95a44cbc8520ee9b483694p0L, 0x1.a0fc6f7c7d61b2b3a22a0eab2cadp-88L},
|
||||
{0x1.97d829fde4e4f8b9e920f8p0L, 0x1.1e8bd7edb9d7144b6f6818084cc7p-88L},
|
||||
{0x1.9a0f170ca07b9ba3109b8cp0L, 0x4.6737beb19e1eada6825d3c557428p-92L},
|
||||
{0x1.9c49182a3f0901c7c46b06p0L, 0x1.1f2be58ddade50c217186c90b457p-88L},
|
||||
{0x1.9e86319e323231824ca78ep0L, 0x6.4c6e010f92c082bbadfaf605cfd4p-92L},
|
||||
{0x1.a0c667b5de564b29ada8b8p0L, 0xc.ab349aa0422a8da7d4512edac548p-92L},
|
||||
{0x1.a309bec4a2d3358c171f76p0L, 0x1.0daad547fa22c26d168ea762d854p-88L},
|
||||
{0x1.a5503b23e255c8b424491cp0L, 0xa.f87bc8050a405381703ef7caff50p-92L},
|
||||
{0x1.a799e1330b3586f2dfb2b0p0L, 0x1.58f1a98796ce8908ae852236ca94p-88L},
|
||||
{0x1.a9e6b5579fdbf43eb243bcp0L, 0x1.ff4c4c58b571cf465caf07b4b9f5p-88L},
|
||||
{0x1.ac36bbfd3f379c0db966a2p0L, 0x1.1265fc73e480712d20f8597a8e7bp-88L},
|
||||
{0x1.ae89f995ad3ad5e8734d16p0L, 0x1.73205a7fbc3ae675ea440b162d6cp-88L},
|
||||
{0x1.b0e07298db66590842acdep0L, 0x1.c6f6ca0e5dcae2aafffa7a0554cbp-88L},
|
||||
{0x1.b33a2b84f15faf6bfd0e7ap0L, 0x1.d947c2575781dbb49b1237c87b6ep-88L},
|
||||
{0x1.b59728de559398e3881110p0L, 0x1.64873c7171fefc410416be0a6525p-88L},
|
||||
{0x1.b7f76f2fb5e46eaa7b081ap0L, 0xb.53c5354c8903c356e4b625aacc28p-92L},
|
||||
{0x1.ba5b030a10649840cb3c6ap0L, 0xf.5b47f297203757e1cc6eadc8bad0p-92L},
|
||||
{0x1.bcc1e904bc1d2247ba0f44p0L, 0x1.b3d08cd0b20287092bd59be4ad98p-88L},
|
||||
{0x1.bf2c25bd71e088408d7024p0L, 0x1.18e3449fa073b356766dfb568ff4p-88L},
|
||||
{0x1.c199bdd85529c2220cb12ap0L, 0x9.1ba6679444964a36661240043970p-96L},
|
||||
{0x1.c40ab5fffd07a6d14df820p0L, 0xf.1828a5366fd387a7bdd54cdf7300p-92L},
|
||||
{0x1.c67f12e57d14b4a2137fd2p0L, 0xf.2b301dd9e6b151a6d1f9d5d5f520p-96L},
|
||||
{0x1.c8f6d9406e7b511acbc488p0L, 0x5.c442ddb55820171f319d9e5076a8p-96L},
|
||||
{0x1.cb720dcef90691503cbd1ep0L, 0x9.49db761d9559ac0cb6dd3ed599e0p-92L},
|
||||
{0x1.cdf0b555dc3f9c44f8958ep0L, 0x1.ac51be515f8c58bdfb6f5740a3a4p-88L},
|
||||
{0x1.d072d4a07897b8d0f22f20p0L, 0x1.a158e18fbbfc625f09f4cca40874p-88L},
|
||||
{0x1.d2f87080d89f18ade12398p0L, 0x9.ea2025b4c56553f5cdee4c924728p-92L},
|
||||
{0x1.d5818dcfba48725da05aeap0L, 0x1.66e0dca9f589f559c0876ff23830p-88L},
|
||||
{0x1.d80e316c98397bb84f9d04p0L, 0x8.805f84bec614de269900ddf98d28p-92L},
|
||||
{0x1.da9e603db3285708c01a5ap0L, 0x1.6d4c97f6246f0ec614ec95c99392p-88L},
|
||||
{0x1.dd321f301b4604b695de3cp0L, 0x6.30a393215299e30d4fb73503c348p-96L},
|
||||
{0x1.dfc97337b9b5eb968cac38p0L, 0x1.ed291b7225a944efd5bb5524b927p-88L},
|
||||
{0x1.e264614f5a128a12761fa0p0L, 0x1.7ada6467e77f73bf65e04c95e29dp-88L},
|
||||
{0x1.e502ee78b3ff6273d13014p0L, 0x1.3991e8f49659e1693be17ae1d2f9p-88L},
|
||||
{0x1.e7a51fbc74c834b548b282p0L, 0x1.23786758a84f4956354634a416cep-88L},
|
||||
{0x1.ea4afa2a490d9858f73a18p0L, 0xf.5db301f86dea20610ceee13eb7b8p-92L},
|
||||
{0x1.ecf482d8e67f08db0312fap0L, 0x1.949cef462010bb4bc4ce72a900dfp-88L},
|
||||
{0x1.efa1bee615a27771fd21a8p0L, 0x1.2dac1f6dd5d229ff68e46f27e3dfp-88L},
|
||||
{0x1.f252b376bba974e8696fc2p0L, 0x1.6390d4c6ad5476b5162f40e1d9a9p-88L},
|
||||
{0x1.f50765b6e4540674f84b76p0L, 0x2.862baff99000dfc4352ba29b8908p-92L},
|
||||
{0x1.f7bfdad9cbe138913b4bfep0L, 0x7.2bd95c5ce7280fa4d2344a3f5618p-92L},
|
||||
{0x1.fa7c1819e90d82e90a7e74p0L, 0xb.263c1dc060c36f7650b4c0f233a8p-92L},
|
||||
{0x1.fd3c22b8f71f10975ba4b2p0L, 0x1.2bcf3a5e12d269d8ad7c1a4a8875p-88L}
|
||||
};
|
||||
|
||||
/*
|
||||
* Kernel for expl(x). x must be finite and not tiny or huge.
|
||||
* "tiny" is anything that would make us underflow (|A6*x^6| < ~LDBL_MIN).
|
||||
* "huge" is anything that would make fn*L1 inexact (|x| > ~2**17*ln2).
|
||||
*/
|
||||
static inline void
|
||||
__k_expl(long double x, long double *hip, long double *lop, int *kp)
|
||||
{
|
||||
long double q, r, r1, t;
|
||||
double dr, fn, r2;
|
||||
int n, n2;
|
||||
extern const struct ExplData kExplData[INTERVALS];
|
||||
|
||||
/* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
|
||||
fn = rnint((double)x * INV_L);
|
||||
n = irint(fn);
|
||||
n2 = (unsigned)n % INTERVALS;
|
||||
/* Depend on the sign bit being propagated: */
|
||||
*kp = n >> LOG2_INTERVALS;
|
||||
r1 = x - fn * L1;
|
||||
r2 = fn * -L2;
|
||||
r = r1 + r2;
|
||||
|
||||
/* Evaluate expl(endpoint[n2] + r1 + r2) = tbl[n2] * expl(r1 + r2). */
|
||||
dr = r;
|
||||
q = r2 + r * r * (A2 + r * (A3 + r * (A4 + r * (A5 + r * (A6 +
|
||||
dr * (A7 + dr * (A8 + dr * (A9 + dr * A10))))))));
|
||||
t = tbl[n2].lo + tbl[n2].hi;
|
||||
*hip = tbl[n2].hi;
|
||||
*lop = tbl[n2].lo + t * (q + r1);
|
||||
}
|
||||
void __k_expl(long double , long double *, long double *, int *) _Hide;
|
||||
|
||||
/*
|
||||
* XXX: the rest of the functions are identical for ld80 and ld128.
|
||||
|
|
|
@ -31,7 +31,7 @@ asm(".ident\t\"\\n\\n\
|
|||
Musl libc (MIT License)\\n\
|
||||
Copyright 2005-2014 Rich Felker, et. al.\"");
|
||||
asm(".include \"libc/disclaimer.inc\"");
|
||||
/* clang-format off */
|
||||
// clang-format off
|
||||
|
||||
/**
|
||||
* Splits number normalized fraction and exponent.
|
||||
|
@ -56,3 +56,7 @@ double frexp(double x, int *e)
|
|||
y.i |= 0x3fe0000000000000ull;
|
||||
return y.d;
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(frexp, frexpl);
|
||||
#endif
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#include "libc/tinymath/freebsd.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
FreeBSD libm (BSD-2 License)\\n\
|
||||
|
@ -64,3 +65,5 @@ frexpl(long double x, int *ex)
|
|||
}
|
||||
return (u.e);
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -99,3 +99,7 @@ double hypot(double x, double y)
|
|||
sq(&hy, &ly, y);
|
||||
return z*sqrt(ly+lx+hy+hx);
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(hypot, hypotl);
|
||||
#endif
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
|
@ -34,12 +35,6 @@ Copyright 2005-2014 Rich Felker, et. al.\"");
|
|||
asm(".include \"libc/disclaimer.inc\"");
|
||||
// clang-format off
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
long double hypotl(long double x, long double y)
|
||||
{
|
||||
return hypot(x, y);
|
||||
}
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
#if LDBL_MANT_DIG == 64
|
||||
#define SPLIT (0x1p32L+1)
|
||||
#elif LDBL_MANT_DIG == 113
|
||||
|
@ -56,6 +51,9 @@ static void sq(long double *hi, long double *lo, long double x)
|
|||
*lo = xh*xh - *hi + 2*xh*xl + xl*xl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns euclidean distance.
|
||||
*/
|
||||
long double hypotl(long double x, long double y)
|
||||
{
|
||||
union ldshape ux = {x}, uy = {y};
|
||||
|
@ -97,6 +95,5 @@ long double hypotl(long double x, long double y)
|
|||
sq(&hy, &ly, y);
|
||||
return z*sqrtl(ly+lx+hy+hx);
|
||||
}
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
252
libc/tinymath/kexpl.c
Normal file
252
libc/tinymath/kexpl.c
Normal file
|
@ -0,0 +1,252 @@
|
|||
/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│
|
||||
╚──────────────────────────────────────────────────────────────────────────────╝
|
||||
│ │
|
||||
│ FreeBSD lib/msun/src/s_tanhf.c │
|
||||
│ Converted to long double by Bruce D. Evans. │
|
||||
│ │
|
||||
│ Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. │
|
||||
│ │
|
||||
│ Developed at SunPro, a Sun Microsystems, Inc. business. │
|
||||
│ Permission to use, copy, modify, and distribute this │
|
||||
│ software is freely granted, provided that this notice │
|
||||
│ is preserved. │
|
||||
│ │
|
||||
│ Copyright (c) 1992-2023 The FreeBSD Project. │
|
||||
│ │
|
||||
│ Redistribution and use in source and binary forms, with or without │
|
||||
│ modification, are permitted provided that the following conditions │
|
||||
│ are met: │
|
||||
│ 1. Redistributions of source code must retain the above copyright │
|
||||
│ notice, this list of conditions and the following disclaimer. │
|
||||
│ 2. Redistributions in binary form must reproduce the above copyright │
|
||||
│ notice, this list of conditions and the following disclaimer in the │
|
||||
│ documentation and/or other materials provided with the distribution. │
|
||||
│ │
|
||||
│ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND │
|
||||
│ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE │
|
||||
│ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE │
|
||||
│ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE │
|
||||
│ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL │
|
||||
│ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS │
|
||||
│ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) │
|
||||
│ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT │
|
||||
│ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY │
|
||||
│ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF │
|
||||
│ SUCH DAMAGE. │
|
||||
│ │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/tinymath/freebsd.internal.h"
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
FreeBSD libm (BSD-2 License)\\n\
|
||||
Copyright (c) 2005-2011, Bruce D. Evans, Steven G. Kargl, David Schultz.\"");
|
||||
// clang-format off
|
||||
|
||||
/*
|
||||
* ld128 version of k_expl.h. See ../ld80/s_expl.c for most comments.
|
||||
*
|
||||
* See ../src/e_exp.c and ../src/k_exp.h for precision-independent comments
|
||||
* about the secondary kernels.
|
||||
*/
|
||||
|
||||
#define INTERVALS 128
|
||||
#define LOG2_INTERVALS 7
|
||||
|
||||
static const double
|
||||
/*
|
||||
* ln2/INTERVALS = L1+L2 (hi+lo decomposition for multiplication). L1 must
|
||||
* have at least 22 (= log2(|LDBL_MIN_EXP-extras|) + log2(INTERVALS)) lowest
|
||||
* bits zero so that multiplication of it by n is exact.
|
||||
*/
|
||||
INV_L = 1.8466496523378731e+2, /* 0x171547652b82fe.0p-45 */
|
||||
L2 = -1.0253670638894731e-29; /* -0x1.9ff0342542fc3p-97 */
|
||||
static const long double
|
||||
/* 0x1.62e42fefa39ef35793c768000000p-8 */
|
||||
L1 = 5.41521234812457272982212595914567508e-3L;
|
||||
|
||||
/*
|
||||
* XXX values in hex in comments have been lost (or were never present)
|
||||
* from here.
|
||||
*/
|
||||
static const long double
|
||||
/*
|
||||
* Domain [-0.002708, 0.002708], range ~[-2.4021e-38, 2.4234e-38]:
|
||||
* |exp(x) - p(x)| < 2**-124.9
|
||||
* (0.002708 is ln2/(2*INTERVALS) rounded up a little).
|
||||
*
|
||||
* XXX the coeffs aren't very carefully rounded, and I get 3.6 more bits.
|
||||
*/
|
||||
A2 = 0.5,
|
||||
A3 = 1.66666666666666666666666666651085500e-1L,
|
||||
A4 = 4.16666666666666666666666666425885320e-2L,
|
||||
A5 = 8.33333333333333333334522877160175842e-3L,
|
||||
A6 = 1.38888888888888888889971139751596836e-3L;
|
||||
|
||||
static const double
|
||||
A7 = 1.9841269841269470e-4, /* 0x1.a01a01a019f91p-13 */
|
||||
A8 = 2.4801587301585286e-5, /* 0x1.71de3ec75a967p-19 */
|
||||
A9 = 2.7557324277411235e-6, /* 0x1.71de3ec75a967p-19 */
|
||||
A10 = 2.7557333722375069e-7; /* 0x1.27e505ab56259p-22 */
|
||||
|
||||
const struct ExplData kExplData[INTERVALS] = {
|
||||
{0x1p0L, 0x0p0L},
|
||||
{0x1.0163da9fb33356d84a66aep0L, 0x3.36dcdfa4003ec04c360be2404078p-92L},
|
||||
{0x1.02c9a3e778060ee6f7cacap0L, 0x4.f7a29bde93d70a2cabc5cb89ba10p-92L},
|
||||
{0x1.04315e86e7f84bd738f9a2p0L, 0xd.a47e6ed040bb4bfc05af6455e9b8p-96L},
|
||||
{0x1.059b0d31585743ae7c548ep0L, 0xb.68ca417fe53e3495f7df4baf84a0p-92L},
|
||||
{0x1.0706b29ddf6ddc6dc403a8p0L, 0x1.d87b27ed07cb8b092ac75e311753p-88L},
|
||||
{0x1.0874518759bc808c35f25cp0L, 0x1.9427fa2b041b2d6829d8993a0d01p-88L},
|
||||
{0x1.09e3ecac6f3834521e060cp0L, 0x5.84d6b74ba2e023da730e7fccb758p-92L},
|
||||
{0x1.0b5586cf9890f6298b92b6p0L, 0x1.1842a98364291408b3ceb0a2a2bbp-88L},
|
||||
{0x1.0cc922b7247f7407b705b8p0L, 0x9.3dc5e8aac564e6fe2ef1d431fd98p-92L},
|
||||
{0x1.0e3ec32d3d1a2020742e4ep0L, 0x1.8af6a552ac4b358b1129e9f966a4p-88L},
|
||||
{0x1.0fb66affed31af232091dcp0L, 0x1.8a1426514e0b627bda694a400a27p-88L},
|
||||
{0x1.11301d0125b50a4ebbf1aep0L, 0xd.9318ceac5cc47ab166ee57427178p-92L},
|
||||
{0x1.12abdc06c31cbfb92bad32p0L, 0x4.d68e2f7270bdf7cedf94eb1cb818p-92L},
|
||||
{0x1.1429aaea92ddfb34101942p0L, 0x1.b2586d01844b389bea7aedd221d4p-88L},
|
||||
{0x1.15a98c8a58e512480d573cp0L, 0x1.d5613bf92a2b618ee31b376c2689p-88L},
|
||||
{0x1.172b83c7d517adcdf7c8c4p0L, 0x1.0eb14a792035509ff7d758693f24p-88L},
|
||||
{0x1.18af9388c8de9bbbf70b9ap0L, 0x3.c2505c97c0102e5f1211941d2840p-92L},
|
||||
{0x1.1a35beb6fcb753cb698f68p0L, 0x1.2d1c835a6c30724d5cfae31b84e5p-88L},
|
||||
{0x1.1bbe084045cd39ab1e72b4p0L, 0x4.27e35f9acb57e473915519a1b448p-92L},
|
||||
{0x1.1d4873168b9aa7805b8028p0L, 0x9.90f07a98b42206e46166cf051d70p-92L},
|
||||
{0x1.1ed5022fcd91cb8819ff60p0L, 0x1.121d1e504d36c47474c9b7de6067p-88L},
|
||||
{0x1.2063b88628cd63b8eeb028p0L, 0x1.50929d0fc487d21c2b84004264dep-88L},
|
||||
{0x1.21f49917ddc962552fd292p0L, 0x9.4bdb4b61ea62477caa1dce823ba0p-92L},
|
||||
{0x1.2387a6e75623866c1fadb0p0L, 0x1.c15cb593b0328566902df69e4de2p-88L},
|
||||
{0x1.251ce4fb2a63f3582ab7dep0L, 0x9.e94811a9c8afdcf796934bc652d0p-92L},
|
||||
{0x1.26b4565e27cdd257a67328p0L, 0x1.d3b249dce4e9186ddd5ff44e6b08p-92L},
|
||||
{0x1.284dfe1f5638096cf15cf0p0L, 0x3.ca0967fdaa2e52d7c8106f2e262cp-92L},
|
||||
{0x1.29e9df51fdee12c25d15f4p0L, 0x1.a24aa3bca890ac08d203fed80a07p-88L},
|
||||
{0x1.2b87fd0dad98ffddea4652p0L, 0x1.8fcab88442fdc3cb6de4519165edp-88L},
|
||||
{0x1.2d285a6e4030b40091d536p0L, 0xd.075384589c1cd1b3e4018a6b1348p-92L},
|
||||
{0x1.2ecafa93e2f5611ca0f45cp0L, 0x1.523833af611bdcda253c554cf278p-88L},
|
||||
{0x1.306fe0a31b7152de8d5a46p0L, 0x3.05c85edecbc27343629f502f1af2p-92L},
|
||||
{0x1.32170fc4cd8313539cf1c2p0L, 0x1.008f86dde3220ae17a005b6412bep-88L},
|
||||
{0x1.33c08b26416ff4c9c8610cp0L, 0x1.96696bf95d1593039539d94d662bp-88L},
|
||||
{0x1.356c55f929ff0c94623476p0L, 0x3.73af38d6d8d6f9506c9bbc93cbc0p-92L},
|
||||
{0x1.371a7373aa9caa7145502ep0L, 0x1.4547987e3e12516bf9c699be432fp-88L},
|
||||
{0x1.38cae6d05d86585a9cb0d8p0L, 0x1.bed0c853bd30a02790931eb2e8f0p-88L},
|
||||
{0x1.3a7db34e59ff6ea1bc9298p0L, 0x1.e0a1d336163fe2f852ceeb134067p-88L},
|
||||
{0x1.3c32dc313a8e484001f228p0L, 0xb.58f3775e06ab66353001fae9fca0p-92L},
|
||||
{0x1.3dea64c12342235b41223ep0L, 0x1.3d773fba2cb82b8244267c54443fp-92L},
|
||||
{0x1.3fa4504ac801ba0bf701aap0L, 0x4.1832fb8c1c8dbdff2c49909e6c60p-92L},
|
||||
{0x1.4160a21f72e29f84325b8ep0L, 0x1.3db61fb352f0540e6ba05634413ep-88L},
|
||||
{0x1.431f5d950a896dc7044394p0L, 0x1.0ccec81e24b0caff7581ef4127f7p-92L},
|
||||
{0x1.44e086061892d03136f408p0L, 0x1.df019fbd4f3b48709b78591d5cb5p-88L},
|
||||
{0x1.46a41ed1d005772512f458p0L, 0x1.229d97df404ff21f39c1b594d3a8p-88L},
|
||||
{0x1.486a2b5c13cd013c1a3b68p0L, 0x1.062f03c3dd75ce8757f780e6ec99p-88L},
|
||||
{0x1.4a32af0d7d3de672d8bcf4p0L, 0x6.f9586461db1d878b1d148bd3ccb8p-92L},
|
||||
{0x1.4bfdad5362a271d4397afep0L, 0xc.42e20e0363ba2e159c579f82e4b0p-92L},
|
||||
{0x1.4dcb299fddd0d63b36ef1ap0L, 0x9.e0cc484b25a5566d0bd5f58ad238p-92L},
|
||||
{0x1.4f9b2769d2ca6ad33d8b68p0L, 0x1.aa073ee55e028497a329a7333dbap-88L},
|
||||
{0x1.516daa2cf6641c112f52c8p0L, 0x4.d822190e718226177d7608d20038p-92L},
|
||||
{0x1.5342b569d4f81df0a83c48p0L, 0x1.d86a63f4e672a3e429805b049465p-88L},
|
||||
{0x1.551a4ca5d920ec52ec6202p0L, 0x4.34ca672645dc6c124d6619a87574p-92L},
|
||||
{0x1.56f4736b527da66ecb0046p0L, 0x1.64eb3c00f2f5ab3d801d7cc7272dp-88L},
|
||||
{0x1.58d12d497c7fd252bc2b72p0L, 0x1.43bcf2ec936a970d9cc266f0072fp-88L},
|
||||
{0x1.5ab07dd48542958c930150p0L, 0x1.91eb345d88d7c81280e069fbdb63p-88L},
|
||||
{0x1.5c9268a5946b701c4b1b80p0L, 0x1.6986a203d84e6a4a92f179e71889p-88L},
|
||||
{0x1.5e76f15ad21486e9be4c20p0L, 0x3.99766a06548a05829e853bdb2b52p-92L},
|
||||
{0x1.605e1b976dc08b076f592ap0L, 0x4.86e3b34ead1b4769df867b9c89ccp-92L},
|
||||
{0x1.6247eb03a5584b1f0fa06ep0L, 0x1.d2da42bb1ceaf9f732275b8aef30p-88L},
|
||||
{0x1.6434634ccc31fc76f8714cp0L, 0x4.ed9a4e41000307103a18cf7a6e08p-92L},
|
||||
{0x1.66238825522249127d9e28p0L, 0x1.b8f314a337f4dc0a3adf1787ff74p-88L},
|
||||
{0x1.68155d44ca973081c57226p0L, 0x1.b9f32706bfe4e627d809a85dcc66p-88L},
|
||||
{0x1.6a09e667f3bcc908b2fb12p0L, 0x1.66ea957d3e3adec17512775099dap-88L},
|
||||
{0x1.6c012750bdabeed76a9980p0L, 0xf.4f33fdeb8b0ecd831106f57b3d00p-96L},
|
||||
{0x1.6dfb23c651a2ef220e2cbep0L, 0x1.bbaa834b3f11577ceefbe6c1c411p-92L},
|
||||
{0x1.6ff7df9519483cf87e1b4ep0L, 0x1.3e213bff9b702d5aa477c12523cep-88L},
|
||||
{0x1.71f75e8ec5f73dd2370f2ep0L, 0xf.0acd6cb434b562d9e8a20adda648p-92L},
|
||||
{0x1.73f9a48a58173bd5c9a4e6p0L, 0x8.ab1182ae217f3a7681759553e840p-92L},
|
||||
{0x1.75feb564267c8bf6e9aa32p0L, 0x1.a48b27071805e61a17b954a2dad8p-88L},
|
||||
{0x1.780694fde5d3f619ae0280p0L, 0x8.58b2bb2bdcf86cd08e35fb04c0f0p-92L},
|
||||
{0x1.7a11473eb0186d7d51023ep0L, 0x1.6cda1f5ef42b66977960531e821bp-88L},
|
||||
{0x1.7c1ed0130c1327c4933444p0L, 0x1.937562b2dc933d44fc828efd4c9cp-88L},
|
||||
{0x1.7e2f336cf4e62105d02ba0p0L, 0x1.5797e170a1427f8fcdf5f3906108p-88L},
|
||||
{0x1.80427543e1a11b60de6764p0L, 0x9.a354ea706b8e4d8b718a672bf7c8p-92L},
|
||||
{0x1.82589994cce128acf88afap0L, 0xb.34a010f6ad65cbbac0f532d39be0p-92L},
|
||||
{0x1.8471a4623c7acce52f6b96p0L, 0x1.c64095370f51f48817914dd78665p-88L},
|
||||
{0x1.868d99b4492ec80e41d90ap0L, 0xc.251707484d73f136fb5779656b70p-92L},
|
||||
{0x1.88ac7d98a669966530bcdep0L, 0x1.2d4e9d61283ef385de170ab20f96p-88L},
|
||||
{0x1.8ace5422aa0db5ba7c55a0p0L, 0x1.92c9bb3e6ed61f2733304a346d8fp-88L},
|
||||
{0x1.8cf3216b5448bef2aa1cd0p0L, 0x1.61c55d84a9848f8c453b3ca8c946p-88L},
|
||||
{0x1.8f1ae991577362b982745cp0L, 0x7.2ed804efc9b4ae1458ae946099d4p-92L},
|
||||
{0x1.9145b0b91ffc588a61b468p0L, 0x1.f6b70e01c2a90229a4c4309ea719p-88L},
|
||||
{0x1.93737b0cdc5e4f4501c3f2p0L, 0x5.40a22d2fc4af581b63e8326efe9cp-92L},
|
||||
{0x1.95a44cbc8520ee9b483694p0L, 0x1.a0fc6f7c7d61b2b3a22a0eab2cadp-88L},
|
||||
{0x1.97d829fde4e4f8b9e920f8p0L, 0x1.1e8bd7edb9d7144b6f6818084cc7p-88L},
|
||||
{0x1.9a0f170ca07b9ba3109b8cp0L, 0x4.6737beb19e1eada6825d3c557428p-92L},
|
||||
{0x1.9c49182a3f0901c7c46b06p0L, 0x1.1f2be58ddade50c217186c90b457p-88L},
|
||||
{0x1.9e86319e323231824ca78ep0L, 0x6.4c6e010f92c082bbadfaf605cfd4p-92L},
|
||||
{0x1.a0c667b5de564b29ada8b8p0L, 0xc.ab349aa0422a8da7d4512edac548p-92L},
|
||||
{0x1.a309bec4a2d3358c171f76p0L, 0x1.0daad547fa22c26d168ea762d854p-88L},
|
||||
{0x1.a5503b23e255c8b424491cp0L, 0xa.f87bc8050a405381703ef7caff50p-92L},
|
||||
{0x1.a799e1330b3586f2dfb2b0p0L, 0x1.58f1a98796ce8908ae852236ca94p-88L},
|
||||
{0x1.a9e6b5579fdbf43eb243bcp0L, 0x1.ff4c4c58b571cf465caf07b4b9f5p-88L},
|
||||
{0x1.ac36bbfd3f379c0db966a2p0L, 0x1.1265fc73e480712d20f8597a8e7bp-88L},
|
||||
{0x1.ae89f995ad3ad5e8734d16p0L, 0x1.73205a7fbc3ae675ea440b162d6cp-88L},
|
||||
{0x1.b0e07298db66590842acdep0L, 0x1.c6f6ca0e5dcae2aafffa7a0554cbp-88L},
|
||||
{0x1.b33a2b84f15faf6bfd0e7ap0L, 0x1.d947c2575781dbb49b1237c87b6ep-88L},
|
||||
{0x1.b59728de559398e3881110p0L, 0x1.64873c7171fefc410416be0a6525p-88L},
|
||||
{0x1.b7f76f2fb5e46eaa7b081ap0L, 0xb.53c5354c8903c356e4b625aacc28p-92L},
|
||||
{0x1.ba5b030a10649840cb3c6ap0L, 0xf.5b47f297203757e1cc6eadc8bad0p-92L},
|
||||
{0x1.bcc1e904bc1d2247ba0f44p0L, 0x1.b3d08cd0b20287092bd59be4ad98p-88L},
|
||||
{0x1.bf2c25bd71e088408d7024p0L, 0x1.18e3449fa073b356766dfb568ff4p-88L},
|
||||
{0x1.c199bdd85529c2220cb12ap0L, 0x9.1ba6679444964a36661240043970p-96L},
|
||||
{0x1.c40ab5fffd07a6d14df820p0L, 0xf.1828a5366fd387a7bdd54cdf7300p-92L},
|
||||
{0x1.c67f12e57d14b4a2137fd2p0L, 0xf.2b301dd9e6b151a6d1f9d5d5f520p-96L},
|
||||
{0x1.c8f6d9406e7b511acbc488p0L, 0x5.c442ddb55820171f319d9e5076a8p-96L},
|
||||
{0x1.cb720dcef90691503cbd1ep0L, 0x9.49db761d9559ac0cb6dd3ed599e0p-92L},
|
||||
{0x1.cdf0b555dc3f9c44f8958ep0L, 0x1.ac51be515f8c58bdfb6f5740a3a4p-88L},
|
||||
{0x1.d072d4a07897b8d0f22f20p0L, 0x1.a158e18fbbfc625f09f4cca40874p-88L},
|
||||
{0x1.d2f87080d89f18ade12398p0L, 0x9.ea2025b4c56553f5cdee4c924728p-92L},
|
||||
{0x1.d5818dcfba48725da05aeap0L, 0x1.66e0dca9f589f559c0876ff23830p-88L},
|
||||
{0x1.d80e316c98397bb84f9d04p0L, 0x8.805f84bec614de269900ddf98d28p-92L},
|
||||
{0x1.da9e603db3285708c01a5ap0L, 0x1.6d4c97f6246f0ec614ec95c99392p-88L},
|
||||
{0x1.dd321f301b4604b695de3cp0L, 0x6.30a393215299e30d4fb73503c348p-96L},
|
||||
{0x1.dfc97337b9b5eb968cac38p0L, 0x1.ed291b7225a944efd5bb5524b927p-88L},
|
||||
{0x1.e264614f5a128a12761fa0p0L, 0x1.7ada6467e77f73bf65e04c95e29dp-88L},
|
||||
{0x1.e502ee78b3ff6273d13014p0L, 0x1.3991e8f49659e1693be17ae1d2f9p-88L},
|
||||
{0x1.e7a51fbc74c834b548b282p0L, 0x1.23786758a84f4956354634a416cep-88L},
|
||||
{0x1.ea4afa2a490d9858f73a18p0L, 0xf.5db301f86dea20610ceee13eb7b8p-92L},
|
||||
{0x1.ecf482d8e67f08db0312fap0L, 0x1.949cef462010bb4bc4ce72a900dfp-88L},
|
||||
{0x1.efa1bee615a27771fd21a8p0L, 0x1.2dac1f6dd5d229ff68e46f27e3dfp-88L},
|
||||
{0x1.f252b376bba974e8696fc2p0L, 0x1.6390d4c6ad5476b5162f40e1d9a9p-88L},
|
||||
{0x1.f50765b6e4540674f84b76p0L, 0x2.862baff99000dfc4352ba29b8908p-92L},
|
||||
{0x1.f7bfdad9cbe138913b4bfep0L, 0x7.2bd95c5ce7280fa4d2344a3f5618p-92L},
|
||||
{0x1.fa7c1819e90d82e90a7e74p0L, 0xb.263c1dc060c36f7650b4c0f233a8p-92L},
|
||||
{0x1.fd3c22b8f71f10975ba4b2p0L, 0x1.2bcf3a5e12d269d8ad7c1a4a8875p-88L}
|
||||
};
|
||||
|
||||
/*
|
||||
* Kernel for expl(x). x must be finite and not tiny or huge.
|
||||
* "tiny" is anything that would make us underflow (|A6*x^6| < ~LDBL_MIN).
|
||||
* "huge" is anything that would make fn*L1 inexact (|x| > ~2**17*ln2).
|
||||
*/
|
||||
void
|
||||
__k_expl(long double x, long double *hip, long double *lop, int *kp)
|
||||
{
|
||||
long double q, r, r1, t;
|
||||
double dr, fn, r2;
|
||||
int n, n2;
|
||||
|
||||
/* Reduce x to (k*ln2 + endpoint[n2] + r1 + r2). */
|
||||
fn = rnint((double)x * INV_L);
|
||||
n = irint(fn);
|
||||
n2 = (unsigned)n % INTERVALS;
|
||||
/* Depend on the sign bit being propagated: */
|
||||
*kp = n >> LOG2_INTERVALS;
|
||||
r1 = x - fn * L1;
|
||||
r2 = fn * -L2;
|
||||
r = r1 + r2;
|
||||
|
||||
/* Evaluate expl(endpoint[n2] + r1 + r2) = kExplData[n2] * expl(r1 + r2). */
|
||||
dr = r;
|
||||
q = r2 + r * r * (A2 + r * (A3 + r * (A4 + r * (A5 + r * (A6 +
|
||||
dr * (A7 + dr * (A8 + dr * (A9 + dr * A10))))))));
|
||||
t = kExplData[n2].lo + kExplData[n2].hi;
|
||||
*hip = kExplData[n2].hi;
|
||||
*lop = kExplData[n2].lo + t * (q + r1);
|
||||
}
|
|
@ -35,7 +35,7 @@ asm(".ident\t\"\\n\\n\
|
|||
Musl libc (MIT License)\\n\
|
||||
Copyright 2005-2014 Rich Felker, et. al.\"");
|
||||
asm(".include \"libc/disclaimer.inc\"");
|
||||
/* clang-format off */
|
||||
// clang-format off
|
||||
|
||||
/* origin: FreeBSD /usr/src/lib/msun/src/e_lgammaf_r.c */
|
||||
/*
|
||||
|
|
|
@ -140,3 +140,7 @@ double log(double x)
|
|||
r * r2 * (A[1] + r * A[2] + r2 * (A[3] + r * A[4])) + hi;
|
||||
return eval_as_double(y);
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(log, logl);
|
||||
#endif
|
||||
|
|
|
@ -141,3 +141,7 @@ double log10(double x)
|
|||
|
||||
return val_lo + val_hi;
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(log10, log10l);
|
||||
#endif
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#include "libc/tinymath/internal.h"
|
||||
#if LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
OpenBSD libm (ISC License)\\n\
|
||||
|
@ -163,11 +164,7 @@ long double log10l(long double x)
|
|||
: "st(1)");
|
||||
return x;
|
||||
|
||||
#elif LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
|
||||
return log10(x);
|
||||
|
||||
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
#else
|
||||
|
||||
long double y, z;
|
||||
int e;
|
||||
|
@ -234,12 +231,7 @@ done:
|
|||
z += e * (L102A);
|
||||
return z;
|
||||
|
||||
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
|
||||
|
||||
long double __log10lq(long double);
|
||||
return __log10lq(x);
|
||||
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* ieee80 */
|
||||
|
|
|
@ -159,3 +159,7 @@ double log1p(double x)
|
|||
dk = k;
|
||||
return s*(hfsq+R) + (dk*ln2_lo+c) - hfsq + f + dk*ln2_hi;
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(log1p, log1pl);
|
||||
#endif
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "libc/complex.h"
|
||||
#include "libc/math.h"
|
||||
#include "libc/tinymath/complex.internal.h"
|
||||
#if LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
OpenBSD libm (ISC License)\\n\
|
||||
|
@ -138,12 +139,6 @@ static const long double C2 = 1.4286068203094172321215E-6L;
|
|||
*/
|
||||
long double log1pl(long double xm1)
|
||||
{
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
|
||||
return log1p(xm1);
|
||||
|
||||
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
|
||||
long double x, y, z;
|
||||
int e;
|
||||
|
||||
|
@ -208,13 +203,6 @@ long double log1pl(long double xm1)
|
|||
z = z + x;
|
||||
z = z + e * C1;
|
||||
return z;
|
||||
|
||||
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
|
||||
|
||||
long double __log1plq(long double);
|
||||
return __log1plq(xm1);
|
||||
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* ieee80 */
|
||||
|
|
|
@ -35,7 +35,7 @@ asm(".ident\t\"\\n\\n\
|
|||
Double-precision math functions (MIT License)\\n\
|
||||
Copyright 2018 ARM Limited\"");
|
||||
asm(".include \"libc/disclaimer.inc\"");
|
||||
/* clang-format off */
|
||||
// clang-format off
|
||||
|
||||
/*
|
||||
* Double-precision log2(x) function.
|
||||
|
@ -157,3 +157,7 @@ double log2(double x)
|
|||
y = lo + r2 * p + hi;
|
||||
return eval_as_double(y);
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(log2, log2l);
|
||||
#endif
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "libc/complex.h"
|
||||
#include "libc/math.h"
|
||||
#include "libc/tinymath/complex.internal.h"
|
||||
#if LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
OpenBSD libm (ISC License)\\n\
|
||||
|
@ -155,11 +156,7 @@ long double log2l(long double x)
|
|||
: "st(1)");
|
||||
return x;
|
||||
|
||||
#elif LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
|
||||
return log2(x);
|
||||
|
||||
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
#else
|
||||
|
||||
long double y, z;
|
||||
int e;
|
||||
|
@ -226,12 +223,7 @@ done:
|
|||
z += e;
|
||||
return z;
|
||||
|
||||
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
|
||||
|
||||
long double __log2lq(long double);
|
||||
return __log2lq(x);
|
||||
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* 80-bit floating point */
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#include "libc/tinymath/internal.h"
|
||||
#if LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
OpenBSD libm (ISC License)\\n\
|
||||
|
@ -151,11 +152,7 @@ long double logl(long double x)
|
|||
: "st(1)");
|
||||
return x;
|
||||
|
||||
#elif LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
|
||||
return log(x);
|
||||
|
||||
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
#else
|
||||
|
||||
long double y, z;
|
||||
int e;
|
||||
|
@ -216,12 +213,7 @@ long double logl(long double x)
|
|||
z = z + e * C1; /* This sum has an error of 1/2 lsb. */
|
||||
return z;
|
||||
|
||||
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
|
||||
|
||||
long double __loglq(long double);
|
||||
return __loglq(x);
|
||||
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* 80-bit floating point */
|
||||
|
|
|
@ -563,8 +563,11 @@ logl(long double x)
|
|||
RETURN2(rp, val_hi, val_lo);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns log(𝟷+𝑥).
|
||||
*/
|
||||
long double
|
||||
__log1plq(long double x)
|
||||
log1pl(long double x)
|
||||
{
|
||||
long double d, d_hi, f_lo, val_hi, val_lo;
|
||||
long double f_hi, twopminusk;
|
||||
|
@ -674,8 +677,11 @@ __log1plq(long double x)
|
|||
|
||||
#ifdef STRUCT_RETURN
|
||||
|
||||
/**
|
||||
* Returns natural logarithm of 𝑥.
|
||||
*/
|
||||
long double
|
||||
__loglq(long double x)
|
||||
logl(long double x)
|
||||
{
|
||||
struct ld r;
|
||||
|
||||
|
@ -701,8 +707,11 @@ invln2_lo = 6.33178418956604368501892137426645911e-10L, /* 0x15c17f0bbbe87fed0
|
|||
invln10_lo_plus_hi = invln10_lo + invln10_hi,
|
||||
invln2_lo_plus_hi = invln2_lo + invln2_hi;
|
||||
|
||||
/**
|
||||
* Calculates log₁₀𝑥.
|
||||
*/
|
||||
long double
|
||||
__log10lq(long double x)
|
||||
log10l(long double x)
|
||||
{
|
||||
struct ld r;
|
||||
long double hi, lo;
|
||||
|
@ -719,8 +728,11 @@ __log10lq(long double x)
|
|||
invln10_lo_plus_hi * lo + invln10_lo * hi);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates log₂𝑥.
|
||||
*/
|
||||
long double
|
||||
__log2lq(long double x)
|
||||
log2l(long double x)
|
||||
{
|
||||
struct ld r;
|
||||
long double hi, lo;
|
||||
|
|
|
@ -113,3 +113,7 @@ long lrint(double x)
|
|||
return lrint_slow(x);
|
||||
#endif /* __x86_64__ */
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(lrint, lrintl);
|
||||
#endif
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include "libc/runtime/fenv.h"
|
||||
#include "libc/tinymath/expo.internal.h"
|
||||
#include "libc/tinymath/feval.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
|
@ -37,10 +38,9 @@ Copyright 2005-2014 Rich Felker, et. al.\"");
|
|||
asm(".include \"libc/disclaimer.inc\"");
|
||||
// clang-format off
|
||||
|
||||
long lrintl(long double x) {
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return lrint(x);
|
||||
#elif defined(FE_INEXACT)
|
||||
long lrintl(long double x)
|
||||
{
|
||||
#ifdef FE_INEXACT
|
||||
/*
|
||||
see comments in lrint.c
|
||||
|
||||
|
@ -61,3 +61,5 @@ raises inexact (with tonearest or upward rounding mode)
|
|||
return rintl(x);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -24,3 +24,7 @@
|
|||
long lround(double x) {
|
||||
return round(x);
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(lround, lroundl);
|
||||
#endif
|
||||
|
|
|
@ -17,7 +17,10 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
long lroundl(long double x) {
|
||||
return roundl(x);
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -17,7 +17,7 @@ struct magicu __magicu_get(uint32_t);
|
|||
* @param d should be `__magicu_get(y)` if computing `x / y`
|
||||
* @return result of unsigned integer division
|
||||
*/
|
||||
static inline optimizesize uint32_t __magicu_div(uint32_t x, struct magicu d) {
|
||||
forceinline uint32_t __magicu_div(uint32_t x, struct magicu d) {
|
||||
return ((((uint64_t)x * d.M) >> 32) + ((d.s & 64) ? x : 0)) >> (d.s & 63);
|
||||
}
|
||||
|
||||
|
|
|
@ -40,3 +40,7 @@ double nearbyint(double x) {
|
|||
#endif /* __aarch64__ */
|
||||
return x;
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(nearbyint, nearbyintl);
|
||||
#endif
|
||||
|
|
|
@ -18,14 +18,12 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#include "libc/runtime/fenv.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
/**
|
||||
* Rounds to nearest integer.
|
||||
*/
|
||||
long double nearbyintl(long double x) {
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return nearbyint(x);
|
||||
#else
|
||||
#ifdef FE_INEXACT
|
||||
// #pragma STDC FENV_ACCESS ON
|
||||
int e;
|
||||
|
@ -36,5 +34,6 @@ long double nearbyintl(long double x) {
|
|||
if (!e) feclearexcept(FE_INEXACT);
|
||||
#endif
|
||||
return x;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -63,3 +63,7 @@ double nextafter(double x, double y)
|
|||
feval(x*x + ux.f*ux.f);
|
||||
return ux.f;
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(nextafter, nextafterl);
|
||||
#endif
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "libc/tinymath/feval.internal.h"
|
||||
#include "libc/tinymath/internal.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
|
@ -38,9 +39,7 @@ asm(".include \"libc/disclaimer.inc\"");
|
|||
|
||||
long double nextafterl(long double x, long double y)
|
||||
{
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return nextafter(x, y);
|
||||
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
#if LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
union ldshape ux, uy;
|
||||
|
||||
if (isunordered(x, y))
|
||||
|
@ -101,7 +100,7 @@ long double nextafterl(long double x, long double y)
|
|||
if ((ux.i.se & 0x7fff) == 0)
|
||||
FORCE_EVAL(x*x + ux.f*ux.f);
|
||||
return ux.f;
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -1,39 +1,23 @@
|
|||
/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│
|
||||
╚──────────────────────────────────────────────────────────────────────────────╝
|
||||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2023 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Musl Libc │
|
||||
│ Copyright © 2005-2020 Rich Felker, et al. │
|
||||
│ │
|
||||
│ Permission is hereby granted, free of charge, to any person obtaining │
|
||||
│ a copy of this software and associated documentation files (the │
|
||||
│ "Software"), to deal in the Software without restriction, including │
|
||||
│ without limitation the rights to use, copy, modify, merge, publish, │
|
||||
│ distribute, sublicense, and/or sell copies of the Software, and to │
|
||||
│ permit persons to whom the Software is furnished to do so, subject to │
|
||||
│ the following conditions: │
|
||||
│ │
|
||||
│ The above copyright notice and this permission notice shall be │
|
||||
│ included in all copies or substantial portions of the Software. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, │
|
||||
│ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF │
|
||||
│ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. │
|
||||
│ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY │
|
||||
│ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, │
|
||||
│ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE │
|
||||
│ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
Copyright 2005-2014 Rich Felker, et. al.\"");
|
||||
asm(".include \"libc/disclaimer.inc\"");
|
||||
// clang-format off
|
||||
|
||||
long double nexttowardl(long double x, long double y)
|
||||
{
|
||||
return nextafterl(x, y);
|
||||
long double nexttowardl(long double x, long double y) {
|
||||
return nextafterl(x, y);
|
||||
}
|
||||
|
|
|
@ -378,3 +378,8 @@ double pow(double x, double y)
|
|||
#endif
|
||||
return exp_inline(ehi, elo, sign_bias);
|
||||
}
|
||||
|
||||
__weak_reference(pow, __pow_finite);
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(pow, powl);
|
||||
#endif
|
||||
|
|
|
@ -1,23 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2023 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
|
||||
double pow10(double x) {
|
||||
return exp10(x);
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2023 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
|
||||
float pow10f(float x) {
|
||||
return exp10f(x);
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2023 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
|
||||
long double pow10l(long double x) {
|
||||
return exp10l(x);
|
||||
}
|
|
@ -221,3 +221,5 @@ float powf(float x, float y)
|
|||
}
|
||||
return exp2_inline(ylogx, sign_bias);
|
||||
}
|
||||
|
||||
__weak_reference(powf, __powf_finite);
|
||||
|
|
|
@ -1,30 +0,0 @@
|
|||
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
|
||||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||||
│ Copyright 2021 Justine Alexandra Roberts Tunney │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and/or distribute this software for │
|
||||
│ any purpose with or without fee is hereby granted, provided that the │
|
||||
│ above copyright notice and this permission notice appear in all copies. │
|
||||
│ │
|
||||
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
|
||||
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
|
||||
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
|
||||
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
|
||||
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
|
||||
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
|
||||
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
|
||||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
|
||||
#define powl __powl_finite
|
||||
#include "libc/tinymath/powl.c"
|
||||
|
||||
double __pow_finite(double x, double y) {
|
||||
return __powl_finite(x, y);
|
||||
}
|
||||
|
||||
float __powf_finite(float x, float y) {
|
||||
return __powl_finite(x, y);
|
||||
}
|
|
@ -19,6 +19,8 @@
|
|||
#include "libc/errno.h"
|
||||
#include "libc/math.h"
|
||||
#include "libc/tinymath/internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
#ifdef __x86_64__
|
||||
|
||||
/**
|
||||
|
@ -93,7 +95,7 @@ long double powl(long double x, long double y) {
|
|||
}
|
||||
}
|
||||
|
||||
#else
|
||||
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
OpenBSD libm (ISC License)\\n\
|
||||
|
@ -173,13 +175,6 @@ asm(".include \"libc/disclaimer.inc\"");
|
|||
*
|
||||
*/
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
long double powl(long double x, long double y)
|
||||
{
|
||||
return pow(x, y);
|
||||
}
|
||||
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
||||
|
||||
/* Table size */
|
||||
#define NXT 32
|
||||
|
||||
|
@ -617,6 +612,7 @@ static long double powil(long double x, int nn)
|
|||
y = 1.0/y;
|
||||
return y;
|
||||
}
|
||||
|
||||
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
|
||||
#include "libc/tinymath/freebsd.internal.h"
|
||||
|
||||
|
@ -1060,8 +1056,8 @@ powl(long double x, long double y)
|
|||
return s * z;
|
||||
}
|
||||
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
|
||||
#endif /* __x86_64__ */
|
||||
|
||||
__weak_reference(powl, __powl_finite);
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -18,7 +18,15 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
|
||||
/**
|
||||
* Returns remainder of dividing 𝑥 by 𝑦.
|
||||
*/
|
||||
double remainder(double x, double y) {
|
||||
int q;
|
||||
return remquo(x, y, &q);
|
||||
}
|
||||
|
||||
__strong_reference(remainder, drem);
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(remainder, remainderl);
|
||||
#endif
|
||||
|
|
|
@ -17,8 +17,58 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#include "libc/tinymath/freebsd.internal.h"
|
||||
|
||||
// clang-format off
|
||||
|
||||
/**
|
||||
* Returns remainder of dividing 𝑥 by 𝑦.
|
||||
*/
|
||||
float remainderf(float x, float y) {
|
||||
int q;
|
||||
return remquof(x, y, &q);
|
||||
}
|
||||
|
||||
static const float zero = 0.0;
|
||||
|
||||
float
|
||||
remainderf2(float x, float p)
|
||||
{
|
||||
int32_t hx,hp;
|
||||
uint32_t sx;
|
||||
float p_half;
|
||||
|
||||
GET_FLOAT_WORD(hx,x);
|
||||
GET_FLOAT_WORD(hp,p);
|
||||
sx = hx&0x80000000;
|
||||
hp &= 0x7fffffff;
|
||||
hx &= 0x7fffffff;
|
||||
|
||||
/* purge off exception values */
|
||||
if((hp==0)|| /* p = 0 */
|
||||
(hx>=0x7f800000)|| /* x not finite */
|
||||
((hp>0x7f800000))) /* p is NaN */
|
||||
return nan_mix_op(x, p, *)/nan_mix_op(x, p, *);
|
||||
|
||||
|
||||
if (hp<=0x7effffff) x = fmodf(x,p+p); /* now x < 2p */
|
||||
if ((hx-hp)==0) return zero*x;
|
||||
x = fabsf(x);
|
||||
p = fabsf(p);
|
||||
if (hp<0x01000000) {
|
||||
if(x+x>p) {
|
||||
x-=p;
|
||||
if(x+x>=p) x -= p;
|
||||
}
|
||||
} else {
|
||||
p_half = (float)0.5*p;
|
||||
if(x>p_half) {
|
||||
x-=p;
|
||||
if(x>=p_half) x -= p;
|
||||
}
|
||||
}
|
||||
GET_FLOAT_WORD(hx,x);
|
||||
if ((hx&0x7fffffff)==0) hx = 0;
|
||||
SET_FLOAT_WORD(x,hx^sx);
|
||||
return x;
|
||||
}
|
||||
|
|
|
@ -17,12 +17,14 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
/**
|
||||
* Returns remainder of dividing 𝑥 by 𝑦.
|
||||
*/
|
||||
long double remainderl(long double x, long double y) {
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return remainder(x, y);
|
||||
#else
|
||||
int q;
|
||||
return remquol(x, y, &q);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -115,3 +115,7 @@ end:
|
|||
*quo = sx^sy ? -(int)q : (int)q;
|
||||
return sx ? -x : x;
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(remquo, remquol);
|
||||
#endif
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
|
@ -37,10 +38,8 @@ asm(".include \"libc/disclaimer.inc\"");
|
|||
/**
|
||||
* Computes remainder and part of quotient.
|
||||
*/
|
||||
long double remquol(long double x, long double y, int *quo) {
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return remquo(x, y, quo);
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
long double remquol(long double x, long double y, int *quo)
|
||||
{
|
||||
union ldshape ux = {x}, uy = {y};
|
||||
int ex = ux.i.se & 0x7fff;
|
||||
int ey = uy.i.se & 0x7fff;
|
||||
|
@ -153,7 +152,6 @@ long double remquol(long double x, long double y, int *quo) {
|
|||
q &= 0x7fffffff;
|
||||
*quo = sx^sy ? -(int)q : (int)q;
|
||||
return sx ? -x : x;
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -58,3 +58,7 @@ double rint(double x)
|
|||
return s ? -0.0 : 0;
|
||||
return y;
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(rint, rintl);
|
||||
#endif
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
|
@ -34,10 +35,8 @@ Copyright 2005-2014 Rich Felker, et. al.\"");
|
|||
asm(".include \"libc/disclaimer.inc\"");
|
||||
// clang-format off
|
||||
|
||||
long double rintl(long double x) {
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return rint(x);
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
long double rintl(long double x)
|
||||
{
|
||||
static const long double toint = 1/LDBL_EPSILON;
|
||||
|
||||
union ldshape u = {x};
|
||||
|
@ -54,7 +53,6 @@ long double rintl(long double x) {
|
|||
if (y == 0)
|
||||
return 0*x;
|
||||
return y;
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -90,3 +90,7 @@ double round(double x)
|
|||
|
||||
#endif /* __aarch64__ */
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(round, roundl);
|
||||
#endif
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "libc/math.h"
|
||||
#include "libc/tinymath/internal.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
|
@ -35,10 +36,11 @@ Copyright 2005-2014 Rich Felker, et. al.\"");
|
|||
asm(".include \"libc/disclaimer.inc\"");
|
||||
// clang-format off
|
||||
|
||||
long double roundl(long double x) {
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return round(x);
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
/**
|
||||
* Rounds 𝑥 to nearest integer, away from zero.
|
||||
*/
|
||||
long double roundl(long double x)
|
||||
{
|
||||
static const long double toint = 1/LDBL_EPSILON;
|
||||
|
||||
union ldshape u = {x};
|
||||
|
@ -63,7 +65,6 @@ long double roundl(long double x) {
|
|||
if (u.i.se >> 15)
|
||||
y = -y;
|
||||
return y;
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -56,18 +56,18 @@ asm(".include \"libc/disclaimer.inc\"");
|
|||
/**
|
||||
* Returns 𝑥 × 2ʸ.
|
||||
*/
|
||||
double scalb(double x, double fn)
|
||||
double scalb(double x, double y)
|
||||
{
|
||||
if (isunordered(x, fn))
|
||||
return x*fn;
|
||||
if (!isfinite(fn)) {
|
||||
if (fn > 0.0)
|
||||
return x*fn;
|
||||
if (isunordered(x, y))
|
||||
return x*y;
|
||||
if (!isfinite(y)) {
|
||||
if (y > 0.0)
|
||||
return x*y;
|
||||
else
|
||||
return x/(-fn);
|
||||
return x/(-y);
|
||||
}
|
||||
if (rint(fn) != fn) return (fn-fn)/(fn-fn);
|
||||
if ( fn > 65000.0) return scalbn(x, 65000);
|
||||
if (-fn > 65000.0) return scalbn(x,-65000);
|
||||
return scalbn(x,(int)fn);
|
||||
if (rint(y) != y) return (y-y)/(y-y);
|
||||
if ( y > 65000.0) return scalbn(x, 65000);
|
||||
if (-y > 65000.0) return scalbn(x,-65000);
|
||||
return scalbn(x,(int)y);
|
||||
}
|
||||
|
|
|
@ -22,5 +22,9 @@
|
|||
* Returns 𝑥 × 2ʸ.
|
||||
*/
|
||||
double scalbln(double x, long n) {
|
||||
return ldexp(x, n > 65536 ? 65536 : n < -65536 ? -65536 : (int)n);
|
||||
return scalbn(x, n > 65536 ? 65536 : n < -65536 ? -65536 : (int)n);
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(scalbln, scalblnl);
|
||||
#endif
|
||||
|
|
|
@ -22,5 +22,5 @@
|
|||
* Returns 𝑥 × 2ʸ.
|
||||
*/
|
||||
float scalblnf(float x, long n) {
|
||||
return ldexpf(x, n);
|
||||
return scalbnf(x, n);
|
||||
}
|
||||
|
|
|
@ -18,6 +18,13 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
|
||||
/**
|
||||
* Return mantissa of 𝑥 scaled to range [1,2).
|
||||
*/
|
||||
double significand(double x) {
|
||||
return scalbn(x, -ilogb(x));
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(significand, significandl);
|
||||
#endif
|
||||
|
|
|
@ -18,6 +18,9 @@
|
|||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
|
||||
/**
|
||||
* Return mantissa of 𝑥 scaled to range [1,2).
|
||||
*/
|
||||
float significandf(float x) {
|
||||
return scalbnf(x, -ilogbf(x));
|
||||
}
|
||||
|
|
|
@ -17,7 +17,13 @@
|
|||
│ PERFORMANCE OF THIS SOFTWARE. │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "libc/math.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
/**
|
||||
* Return mantissa of 𝑥 scaled to range [1,2).
|
||||
*/
|
||||
long double significandl(long double x) {
|
||||
return scalbnl(x, -ilogbl(x));
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -121,3 +121,7 @@ double sin(double x)
|
|||
return -__cos(y[0], y[1]);
|
||||
}
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(sin, sinl);
|
||||
#endif
|
||||
|
|
|
@ -112,3 +112,7 @@ void sincos(double x, double *sin, double *cos)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(sincos, sincosl);
|
||||
#endif
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "libc/tinymath/internal.h"
|
||||
#include "libc/tinymath/kernel.internal.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
|
@ -41,15 +42,6 @@ asm(".include \"libc/disclaimer.inc\"");
|
|||
*/
|
||||
void sincosl(long double x, long double *sin, long double *cos)
|
||||
{
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
|
||||
double sind, cosd;
|
||||
sincos(x, &sind, &cosd);
|
||||
*sin = sind;
|
||||
*cos = cosd;
|
||||
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
|
||||
union ldshape u = {x};
|
||||
unsigned n;
|
||||
long double y[2], s, c;
|
||||
|
@ -94,8 +86,6 @@ void sincosl(long double x, long double *sin, long double *cos)
|
|||
*cos = s;
|
||||
break;
|
||||
}
|
||||
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "libc/tinymath/internal.h"
|
||||
#include "libc/tinymath/kernel.internal.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
|
@ -41,9 +42,6 @@ asm(".include \"libc/disclaimer.inc\"");
|
|||
*/
|
||||
long double sinl(long double x)
|
||||
{
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
return sin(x);
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
union ldshape u = {x};
|
||||
unsigned n;
|
||||
long double y[2], hi, lo;
|
||||
|
@ -73,7 +71,6 @@ long double sinl(long double x)
|
|||
default:
|
||||
return -__cosl(hi, lo);
|
||||
}
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -220,3 +220,7 @@ double sqrt(double x)
|
|||
|
||||
#endif /* __x86_64__ */
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(sqrt, sqrtl);
|
||||
#endif
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "libc/math.h"
|
||||
#include "libc/tinymath/internal.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
|
@ -36,13 +37,6 @@ Copyright 2005-2014 Rich Felker, et. al.\"");
|
|||
asm(".include \"libc/disclaimer.inc\"");
|
||||
// clang-format off
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
long double sqrtl(long double x)
|
||||
{
|
||||
return sqrt(x);
|
||||
}
|
||||
#elif (LDBL_MANT_DIG == 113 || LDBL_MANT_DIG == 64) && LDBL_MAX_EXP == 16384
|
||||
|
||||
#define FENV_SUPPORT 1
|
||||
|
||||
typedef struct {
|
||||
|
@ -298,6 +292,4 @@ long double sqrtl(long double x)
|
|||
#endif /* __x86__ */
|
||||
}
|
||||
|
||||
#else
|
||||
#error unsupported long double format
|
||||
#endif
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -113,3 +113,7 @@ double tan(double x)
|
|||
n = __rem_pio2(x, y);
|
||||
return __tan(y[0], y[1], n&1);
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(tan, tanl);
|
||||
#endif
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "libc/tinymath/internal.h"
|
||||
#include "libc/tinymath/kernel.internal.h"
|
||||
#include "libc/tinymath/ldshape.internal.h"
|
||||
#if !(LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024)
|
||||
|
||||
asm(".ident\t\"\\n\\n\
|
||||
Musl libc (MIT License)\\n\
|
||||
|
@ -41,12 +42,6 @@ asm(".include \"libc/disclaimer.inc\"");
|
|||
*/
|
||||
long double tanl(long double x)
|
||||
{
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
|
||||
return tan(x);
|
||||
|
||||
#elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
|
||||
|
||||
union ldshape u = {x};
|
||||
long double y[2];
|
||||
unsigned n;
|
||||
|
@ -64,8 +59,6 @@ long double tanl(long double x)
|
|||
}
|
||||
n = __rem_pio2l(x, y);
|
||||
return __tanl(y[0], y[1], n&1);
|
||||
|
||||
#else
|
||||
#error "architecture unsupported"
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* long double is long */
|
||||
|
|
|
@ -33,7 +33,7 @@ asm(".ident\t\"\\n\\n\
|
|||
Musl libc (MIT License)\\n\
|
||||
Copyright 2005-2014 Rich Felker, et. al.\"");
|
||||
asm(".include \"libc/disclaimer.inc\"");
|
||||
/* clang-format off */
|
||||
// clang-format off
|
||||
|
||||
/*
|
||||
"A Precision Approximation of the Gamma Function" - Cornelius Lanczos (1964)
|
||||
|
@ -141,6 +141,9 @@ static double S(double x)
|
|||
return num/den;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates gamma function of 𝑥.
|
||||
*/
|
||||
double tgamma(double x)
|
||||
{
|
||||
union {double f; uint64_t i;} u = {x};
|
||||
|
|
0
libc/tinymath/tinymath.h
Executable file
0
libc/tinymath/tinymath.h
Executable file
|
@ -80,3 +80,7 @@ double trunc(double x)
|
|||
|
||||
#endif /* __aarch64__ */
|
||||
}
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
__strong_reference(trunc, truncl);
|
||||
#endif
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue