From 839e2f4cfb0ba4b2a687ecc1ab3e2aac9c93aab9 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Sun, 28 Feb 2021 01:06:00 -0800 Subject: [PATCH] Add hyperbolic math functions See #61 --- libc/tinymath/acosh.c | 26 ++++++++++++++ libc/tinymath/acoshf.c | 26 ++++++++++++++ libc/tinymath/acoshl.c | 26 ++++++++++++++ libc/tinymath/asinh.c | 26 ++++++++++++++ libc/tinymath/asinhf.c | 26 ++++++++++++++ libc/tinymath/asinhl.c | 26 ++++++++++++++ libc/tinymath/atanh.c | 26 ++++++++++++++ libc/tinymath/atanhf.c | 26 ++++++++++++++ libc/tinymath/atanhl.c | 26 ++++++++++++++ libc/tinymath/cosh.c | 26 ++++++++++++++ libc/tinymath/coshf.c | 26 ++++++++++++++ libc/tinymath/coshl.c | 26 ++++++++++++++ libc/tinymath/sinh.c | 26 ++++++++++++++ libc/tinymath/sinhf.c | 26 ++++++++++++++ libc/tinymath/sinhl.c | 26 ++++++++++++++ libc/tinymath/tanh.c | 27 ++++++++++++++ libc/tinymath/tanhf.c | 27 ++++++++++++++ libc/tinymath/tanhl.c | 27 ++++++++++++++ test/libc/tinymath/acosh_test.c | 56 +++++++++++++++++++++++++++++ test/libc/tinymath/asinh_test.c | 50 ++++++++++++++++++++++++++ test/libc/tinymath/atanh_test.c | 56 +++++++++++++++++++++++++++++ test/libc/tinymath/cosh_test.c | 62 +++++++++++++++++++++++++++++++++ test/libc/tinymath/sinh_test.c | 59 +++++++++++++++++++++++++++++++ test/libc/tinymath/tanh_test.c | 53 ++++++++++++++++++++++++++++ 24 files changed, 807 insertions(+) create mode 100644 libc/tinymath/acosh.c create mode 100644 libc/tinymath/acoshf.c create mode 100644 libc/tinymath/acoshl.c create mode 100644 libc/tinymath/asinh.c create mode 100644 libc/tinymath/asinhf.c create mode 100644 libc/tinymath/asinhl.c create mode 100644 libc/tinymath/atanh.c create mode 100644 libc/tinymath/atanhf.c create mode 100644 libc/tinymath/atanhl.c create mode 100644 libc/tinymath/cosh.c create mode 100644 libc/tinymath/coshf.c create mode 100644 libc/tinymath/coshl.c create mode 100644 libc/tinymath/sinh.c create mode 100644 libc/tinymath/sinhf.c create mode 100644 libc/tinymath/sinhl.c create mode 100644 libc/tinymath/tanh.c create mode 100644 libc/tinymath/tanhf.c create mode 100644 libc/tinymath/tanhl.c create mode 100644 test/libc/tinymath/acosh_test.c create mode 100644 test/libc/tinymath/asinh_test.c create mode 100644 test/libc/tinymath/atanh_test.c create mode 100644 test/libc/tinymath/cosh_test.c create mode 100644 test/libc/tinymath/sinh_test.c create mode 100644 test/libc/tinymath/tanh_test.c diff --git a/libc/tinymath/acosh.c b/libc/tinymath/acosh.c new file mode 100644 index 000000000..5880ba899 --- /dev/null +++ b/libc/tinymath/acosh.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns inverse hyperbolic cosine of 𝑥. + */ +double acosh(double x) { + return log(x + sqrt(x * x - 1)); +} diff --git a/libc/tinymath/acoshf.c b/libc/tinymath/acoshf.c new file mode 100644 index 000000000..581741cfd --- /dev/null +++ b/libc/tinymath/acoshf.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns inverse hyperbolic cosine of 𝑥. + */ +float acoshf(float x) { + return logf(x + sqrtf(x * x - 1)); +} diff --git a/libc/tinymath/acoshl.c b/libc/tinymath/acoshl.c new file mode 100644 index 000000000..d698b3241 --- /dev/null +++ b/libc/tinymath/acoshl.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns inverse hyperbolic cosine of 𝑥. + */ +long double acoshl(long double x) { + return logl(x + sqrtl(x * x - 1)); +} diff --git a/libc/tinymath/asinh.c b/libc/tinymath/asinh.c new file mode 100644 index 000000000..c18532aa1 --- /dev/null +++ b/libc/tinymath/asinh.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns inverse hyperbolic sine of 𝑥. + */ +double asinh(double x) { + return copysign(log(fabs(x) + sqrt(x * x + 1)), x); +} diff --git a/libc/tinymath/asinhf.c b/libc/tinymath/asinhf.c new file mode 100644 index 000000000..dd5ca0712 --- /dev/null +++ b/libc/tinymath/asinhf.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns inverse hyperbolic sine of 𝑥. + */ +float asinhf(float x) { + return copysignf(logf(fabsf(x) + sqrtf(x * x + 1)), x); +} diff --git a/libc/tinymath/asinhl.c b/libc/tinymath/asinhl.c new file mode 100644 index 000000000..339038d14 --- /dev/null +++ b/libc/tinymath/asinhl.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns inverse hyperbolic sine of 𝑥. + */ +long double asinhl(long double x) { + return copysignl(logl(fabsl(x) + sqrtl(x * x + 1)), x); +} diff --git a/libc/tinymath/atanh.c b/libc/tinymath/atanh.c new file mode 100644 index 000000000..7927aa709 --- /dev/null +++ b/libc/tinymath/atanh.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns inverse hyperbolic tangent of 𝑥. + */ +double atanh(double x) { + return log((1 + x) / (1 - x)) / 2; +} diff --git a/libc/tinymath/atanhf.c b/libc/tinymath/atanhf.c new file mode 100644 index 000000000..702a4ae34 --- /dev/null +++ b/libc/tinymath/atanhf.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns inverse hyperbolic tangent of 𝑥. + */ +float atanhf(float x) { + return logf((1 + x) / (1 - x)) / 2; +} diff --git a/libc/tinymath/atanhl.c b/libc/tinymath/atanhl.c new file mode 100644 index 000000000..54baf9bc4 --- /dev/null +++ b/libc/tinymath/atanhl.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns inverse hyperbolic tangent of 𝑥. + */ +long double atanhl(long double x) { + return logl((1 + x) / (1 - x)) / 2; +} diff --git a/libc/tinymath/cosh.c b/libc/tinymath/cosh.c new file mode 100644 index 000000000..19d41418d --- /dev/null +++ b/libc/tinymath/cosh.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns hyperbolic cosine of 𝑥. + */ +double cosh(double x) { + return (exp(x) + exp(-x)) / 2; +} diff --git a/libc/tinymath/coshf.c b/libc/tinymath/coshf.c new file mode 100644 index 000000000..4c8fcd5b6 --- /dev/null +++ b/libc/tinymath/coshf.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns hyperbolic cosine of 𝑥. + */ +float coshf(float x) { + return (expf(x) + expf(-x)) / 2; +} diff --git a/libc/tinymath/coshl.c b/libc/tinymath/coshl.c new file mode 100644 index 000000000..e1f8faf10 --- /dev/null +++ b/libc/tinymath/coshl.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns hyperbolic cosine of 𝑥. + */ +long double coshl(long double x) { + return (expl(x) + expl(-x)) / 2; +} diff --git a/libc/tinymath/sinh.c b/libc/tinymath/sinh.c new file mode 100644 index 000000000..6cab29aa8 --- /dev/null +++ b/libc/tinymath/sinh.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns hyperbolic sine of 𝑥. + */ +double sinh(double x) { + return (exp(x) - exp(-x)) / 2; +} diff --git a/libc/tinymath/sinhf.c b/libc/tinymath/sinhf.c new file mode 100644 index 000000000..db7088279 --- /dev/null +++ b/libc/tinymath/sinhf.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns hyperbolic sine of 𝑥. + */ +float sinhf(float x) { + return (expf(x) - expf(-x)) / 2; +} diff --git a/libc/tinymath/sinhl.c b/libc/tinymath/sinhl.c new file mode 100644 index 000000000..16c79e330 --- /dev/null +++ b/libc/tinymath/sinhl.c @@ -0,0 +1,26 @@ +/*-*- 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" + +/** + * Returns hyperbolic sine of 𝑥. + */ +long double sinhl(long double x) { + return (expl(x) - expl(-x)) / 2; +} diff --git a/libc/tinymath/tanh.c b/libc/tinymath/tanh.c new file mode 100644 index 000000000..8139d00f0 --- /dev/null +++ b/libc/tinymath/tanh.c @@ -0,0 +1,27 @@ +/*-*- 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" + +/** + * Returns hyperbolic tangent of 𝑥. + */ +double tanh(double x) { + if (isinf(x)) return copysign(1, x); + return sinh(x) / cosh(x); +} diff --git a/libc/tinymath/tanhf.c b/libc/tinymath/tanhf.c new file mode 100644 index 000000000..aef44313f --- /dev/null +++ b/libc/tinymath/tanhf.c @@ -0,0 +1,27 @@ +/*-*- 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" + +/** + * Returns hyperbolic tangent of 𝑥. + */ +float tanhf(float x) { + if (isinf(x)) return copysignf(1, x); + return sinhf(x) / coshf(x); +} diff --git a/libc/tinymath/tanhl.c b/libc/tinymath/tanhl.c new file mode 100644 index 000000000..3c76761bf --- /dev/null +++ b/libc/tinymath/tanhl.c @@ -0,0 +1,27 @@ +/*-*- 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" + +/** + * Returns hyperbolic tangent of 𝑥. + */ +long double tanhl(long double x) { + if (isinf(x)) return copysignl(1, x); + return sinhl(x) / coshl(x); +} diff --git a/test/libc/tinymath/acosh_test.c b/test/libc/tinymath/acosh_test.c new file mode 100644 index 000000000..8f24f96fa --- /dev/null +++ b/test/libc/tinymath/acosh_test.c @@ -0,0 +1,56 @@ +/*-*- 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" +#include "libc/runtime/gc.h" +#include "libc/testlib/testlib.h" +#include "libc/x/x.h" + +#define acoshl(x) acoshl(VEIL("t", (long double)(x))) +#define acosh(x) acosh(VEIL("x", (double)(x))) +#define acoshf(x) acoshf(VEIL("x", (float)(x))) + +TEST(acosh, test) { + EXPECT_STREQ(".962423650119207", gc(xdtoa(acosh(1.5)))); + EXPECT_STREQ("0", gc(xdtoa(acosh(1)))); + EXPECT_TRUE(isnan(acosh(NAN))); + EXPECT_TRUE(isnan(acosh(.5))); + EXPECT_TRUE(isnan(acosh(-.5))); + EXPECT_TRUE(isnan(acosh(-1.5))); + EXPECT_STREQ("INFINITY", gc(xdtoa(acosh(INFINITY)))); +} + +TEST(acoshf, test) { + EXPECT_STREQ(".962424", gc(xdtoaf(acoshf(1.5)))); + EXPECT_STREQ("0", gc(xdtoaf(acoshf(1)))); + EXPECT_TRUE(isnan(acoshf(NAN))); + EXPECT_TRUE(isnan(acoshf(.5))); + EXPECT_TRUE(isnan(acoshf(-.5))); + EXPECT_TRUE(isnan(acoshf(-1.5))); + EXPECT_STREQ("INFINITY", gc(xdtoaf(acoshf(INFINITY)))); +} + +TEST(acoshl, test) { + EXPECT_STREQ(".9624236501192069", gc(xdtoal(acoshl(1.5)))); + EXPECT_STREQ("0", gc(xdtoal(acoshl(1)))); + EXPECT_TRUE(isnan(acoshl(NAN))); + EXPECT_TRUE(isnan(acoshl(.5))); + EXPECT_TRUE(isnan(acoshl(-.5))); + EXPECT_TRUE(isnan(acoshl(-1.5))); + EXPECT_STREQ("INFINITY", gc(xdtoal(acoshl(INFINITY)))); +} diff --git a/test/libc/tinymath/asinh_test.c b/test/libc/tinymath/asinh_test.c new file mode 100644 index 000000000..609447547 --- /dev/null +++ b/test/libc/tinymath/asinh_test.c @@ -0,0 +1,50 @@ +/*-*- 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" +#include "libc/runtime/gc.h" +#include "libc/testlib/testlib.h" +#include "libc/x/x.h" + +#define asinhl(x) asinhl(VEIL("t", (long double)(x))) +#define asinh(x) asinh(VEIL("x", (double)(x))) +#define asinhf(x) asinhf(VEIL("x", (float)(x))) + +TEST(asinh, test) { + EXPECT_STREQ(".481211825059603", gc(xdtoa(asinh(+.5)))); + EXPECT_STREQ("-.481211825059603", gc(xdtoa(asinh(-.5)))); + EXPECT_STREQ("0", gc(xdtoa(asinh(0)))); + EXPECT_STREQ("NAN", gc(xdtoa(asinh(NAN)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(asinh(INFINITY)))); +} + +TEST(asinhf, test) { + EXPECT_STREQ(".481212", gc(xdtoaf(asinhf(+.5)))); + EXPECT_STREQ("-.481212", gc(xdtoaf(asinhf(-.5)))); + EXPECT_STREQ("0", gc(xdtoaf(asinhf(0)))); + EXPECT_STREQ("NAN", gc(xdtoaf(asinhf(NAN)))); + EXPECT_STREQ("INFINITY", gc(xdtoaf(asinhf(INFINITY)))); +} + +TEST(asinhl, test) { + EXPECT_STREQ(".4812118250596034", gc(xdtoal(asinhl(+.5)))); + EXPECT_STREQ("-.4812118250596034", gc(xdtoal(asinhl(-.5)))); + EXPECT_STREQ("0", gc(xdtoal(asinhl(0)))); + EXPECT_STREQ("NAN", gc(xdtoal(asinhl(NAN)))); + EXPECT_STREQ("INFINITY", gc(xdtoal(asinhl(INFINITY)))); +} diff --git a/test/libc/tinymath/atanh_test.c b/test/libc/tinymath/atanh_test.c new file mode 100644 index 000000000..c14d10c8d --- /dev/null +++ b/test/libc/tinymath/atanh_test.c @@ -0,0 +1,56 @@ +/*-*- 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" +#include "libc/runtime/gc.h" +#include "libc/testlib/testlib.h" +#include "libc/x/x.h" + +#define atanhl(x) atanhl(VEIL("t", (long double)(x))) +#define atanh(x) atanh(VEIL("x", (double)(x))) +#define atanhf(x) atanhf(VEIL("x", (float)(x))) + +TEST(atanh, test) { + EXPECT_STREQ("0", gc(xdtoa(atanh(0)))); + EXPECT_STREQ(".549306144334055", gc(xdtoa(atanh(.5)))); + EXPECT_STREQ("-.549306144334055", gc(xdtoa(atanh(-.5)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(atanh(+1)))); + EXPECT_STREQ("-INFINITY", gc(xdtoa(atanh(-1)))); + EXPECT_TRUE(isnan(atanh(+1.1))); + EXPECT_TRUE(isnan(atanh(-1.1))); +} + +TEST(atanhl, test) { + EXPECT_STREQ("0", gc(xdtoal(atanhl(0)))); + EXPECT_STREQ(".5493061443340548", gc(xdtoal(atanhl(.5)))); + EXPECT_STREQ("-.5493061443340548", gc(xdtoal(atanhl(-.5)))); + EXPECT_STREQ("INFINITY", gc(xdtoal(atanhl(+1)))); + EXPECT_STREQ("-INFINITY", gc(xdtoal(atanhl(-1)))); + EXPECT_TRUE(isnan(atanhl(+1.1))); + EXPECT_TRUE(isnan(atanhl(-1.1))); +} + +TEST(atanhf, test) { + EXPECT_STREQ("0", gc(xdtoaf(atanhf(0)))); + EXPECT_STREQ(".549306", gc(xdtoaf(atanhf(.5)))); + EXPECT_STREQ("-.549306", gc(xdtoaf(atanhf(-.5)))); + EXPECT_STREQ("INFINITY", gc(xdtoaf(atanhf(+1)))); + EXPECT_STREQ("-INFINITY", gc(xdtoaf(atanhf(-1)))); + EXPECT_TRUE(isnan(atanhf(+1.1))); + EXPECT_TRUE(isnan(atanhf(-1.1))); +} diff --git a/test/libc/tinymath/cosh_test.c b/test/libc/tinymath/cosh_test.c new file mode 100644 index 000000000..50ea6ea5d --- /dev/null +++ b/test/libc/tinymath/cosh_test.c @@ -0,0 +1,62 @@ +/*-*- 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" +#include "libc/runtime/gc.h" +#include "libc/testlib/testlib.h" +#include "libc/x/x.h" + +#define coshl(x) coshl(VEIL("t", (long double)(x))) +#define cosh(x) cosh(VEIL("x", (double)(x))) +#define coshf(x) coshf(VEIL("x", (float)(x))) + +TEST(coshl, test) { + EXPECT_STREQ("1.127625965206381", gc(xdtoal(coshl(+.5)))); + EXPECT_STREQ("1.127625965206381", gc(xdtoal(coshl(-.5)))); + EXPECT_STREQ("INFINITY", gc(xdtoal(coshl(30000)))); + EXPECT_STREQ("INFINITY", gc(xdtoal(coshl(-30000)))); + EXPECT_STREQ("1", gc(xdtoal(coshl(+0.)))); + EXPECT_STREQ("1", gc(xdtoal(coshl(-0.)))); + EXPECT_TRUE(isnan(coshl(NAN))); + EXPECT_STREQ("INFINITY", gc(xdtoal(coshl(INFINITY)))); + EXPECT_STREQ("INFINITY", gc(xdtoal(coshl(-INFINITY)))); +} + +TEST(cosh, test) { + EXPECT_STREQ("1.12762596520638", gc(xdtoa(cosh(+.5)))); + EXPECT_STREQ("1.12762596520638", gc(xdtoa(cosh(-.5)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(cosh(30000)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(cosh(-30000)))); + EXPECT_STREQ("1", gc(xdtoa(cosh(+0.)))); + EXPECT_STREQ("1", gc(xdtoa(cosh(-0.)))); + EXPECT_TRUE(isnan(cosh(NAN))); + EXPECT_STREQ("INFINITY", gc(xdtoa(cosh(INFINITY)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(cosh(-INFINITY)))); +} + +TEST(coshf, test) { + EXPECT_STREQ("1.12763", gc(xdtoaf(coshf(+.5)))); + EXPECT_STREQ("1.12763", gc(xdtoaf(coshf(-.5)))); + EXPECT_STREQ("INFINITY", gc(xdtoaf(coshf(30000)))); + EXPECT_STREQ("INFINITY", gc(xdtoaf(coshf(-30000)))); + EXPECT_STREQ("1", gc(xdtoaf(coshf(+0.)))); + EXPECT_STREQ("1", gc(xdtoaf(coshf(-0.)))); + EXPECT_TRUE(isnan(coshf(NAN))); + EXPECT_STREQ("INFINITY", gc(xdtoaf(coshf(INFINITY)))); + EXPECT_STREQ("INFINITY", gc(xdtoaf(coshf(-INFINITY)))); +} diff --git a/test/libc/tinymath/sinh_test.c b/test/libc/tinymath/sinh_test.c new file mode 100644 index 000000000..bc074df20 --- /dev/null +++ b/test/libc/tinymath/sinh_test.c @@ -0,0 +1,59 @@ +/*-*- 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" +#include "libc/runtime/gc.h" +#include "libc/testlib/testlib.h" +#include "libc/x/x.h" + +#define sinhl(x) sinhl(VEIL("t", (long double)(x))) +#define sinh(x) sinh(VEIL("x", (double)(x))) +#define sinhf(x) sinhf(VEIL("x", (float)(x))) + +TEST(sinh, test) { + EXPECT_STREQ(".521095305493747", gc(xdtoa(sinh(+.5)))); + EXPECT_STREQ("-.521095305493747", gc(xdtoa(sinh(-.5)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(sinh(30000)))); + EXPECT_STREQ("-INFINITY", gc(xdtoa(sinh(-30000)))); + EXPECT_STREQ("0", gc(xdtoa(sinh(0)))); + EXPECT_STREQ("NAN", gc(xdtoa(sinh(NAN)))); + EXPECT_STREQ("INFINITY", gc(xdtoa(sinh(INFINITY)))); + EXPECT_STREQ("-INFINITY", gc(xdtoa(sinh(-INFINITY)))); +} + +TEST(sinhl, test) { + EXPECT_STREQ(".5210953054937474", gc(xdtoal(sinhl(+.5)))); + EXPECT_STREQ("-.5210953054937474", gc(xdtoal(sinhl(-.5)))); + EXPECT_STREQ("INFINITY", gc(xdtoal(sinhl(30000)))); + EXPECT_STREQ("-INFINITY", gc(xdtoal(sinhl(-30000)))); + EXPECT_STREQ("0", gc(xdtoal(sinhl(0)))); + EXPECT_STREQ("NAN", gc(xdtoal(sinhl(NAN)))); + EXPECT_STREQ("INFINITY", gc(xdtoal(sinhl(INFINITY)))); + EXPECT_STREQ("-INFINITY", gc(xdtoal(sinhl(-INFINITY)))); +} + +TEST(sinhf, test) { + EXPECT_STREQ(".521095", gc(xdtoaf(sinhf(+.5)))); + EXPECT_STREQ("-.521095", gc(xdtoaf(sinhf(-.5)))); + EXPECT_STREQ("INFINITY", gc(xdtoaf(sinhf(30000)))); + EXPECT_STREQ("-INFINITY", gc(xdtoaf(sinhf(-30000)))); + EXPECT_STREQ("0", gc(xdtoaf(sinhf(0)))); + EXPECT_STREQ("NAN", gc(xdtoaf(sinhf(NAN)))); + EXPECT_STREQ("INFINITY", gc(xdtoaf(sinhf(INFINITY)))); + EXPECT_STREQ("-INFINITY", gc(xdtoaf(sinhf(-INFINITY)))); +} diff --git a/test/libc/tinymath/tanh_test.c b/test/libc/tinymath/tanh_test.c new file mode 100644 index 000000000..ce837bdba --- /dev/null +++ b/test/libc/tinymath/tanh_test.c @@ -0,0 +1,53 @@ +/*-*- 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" +#include "libc/runtime/gc.h" +#include "libc/testlib/testlib.h" +#include "libc/x/x.h" + +#define tanhl(x) tanhl(VEIL("t", (long double)(x))) +#define tanh(x) tanh(VEIL("x", (double)(x))) +#define tanhf(x) tanhf(VEIL("x", (float)(x))) + +TEST(tanhl, test) { + EXPECT_STREQ(".09966799462495582", gc(xdtoal(tanhl(+.1)))); + EXPECT_STREQ("-.09966799462495582", gc(xdtoal(tanhl(-.1)))); + EXPECT_STREQ("0", gc(xdtoal(tanhl(0)))); + EXPECT_TRUE(isnan(tanhl(NAN))); + EXPECT_STREQ("1", gc(xdtoal(tanhl(INFINITY)))); + EXPECT_STREQ("-1", gc(xdtoal(tanhl(-INFINITY)))); +} + +TEST(tanh, test) { + EXPECT_STREQ(".0996679946249559", gc(xdtoa(tanh(+.1)))); + EXPECT_STREQ("-.0996679946249559", gc(xdtoa(tanh(-.1)))); + EXPECT_STREQ("0", gc(xdtoa(tanh(0)))); + EXPECT_TRUE(isnan(tanh(NAN))); + EXPECT_STREQ("1", gc(xdtoa(tanh(INFINITY)))); + EXPECT_STREQ("-1", gc(xdtoa(tanh(-INFINITY)))); +} + +TEST(tanhf, test) { + EXPECT_STREQ(".099668", gc(xdtoaf(tanhf(+.1)))); + EXPECT_STREQ("-.099668", gc(xdtoaf(tanhf(-.1)))); + EXPECT_STREQ("0", gc(xdtoaf(tanhf(0)))); + EXPECT_TRUE(isnan(tanhf(NAN))); + EXPECT_STREQ("1", gc(xdtoaf(tanhf(INFINITY)))); + EXPECT_STREQ("-1", gc(xdtoaf(tanhf(-INFINITY)))); +}