RFR: 8375285: Port fdlibm asinh to Java [v2]
Anton Artemov
aartemov at openjdk.org
Tue Jan 27 09:06:39 UTC 2026
> Hi, please consider the following changes:
>
> This is a port of FDLIBM asinh method.
>
> Original C vs transliteration port:
>
>
> $ diff -w fdlib_asinh.c Asinh.translit.java
> 1c1,3
> < /* asinh(x)
> ---
>> /**
>> * Return the Inverse Hyperbolic Sine of x
>> *
> 2a5
>> *
> 10a14,17
>> private static final class Asinh {
>> private static final double one = 1.0;
>> private static final double ln2 = 6.93147180559945286227e-01;
>> private static final double huge = 1.0e300;
> 12,29c19
> < #include "fdlibm.h"
> <
> < #ifdef __STDC__
> < static const double
> < #else
> < static double
> < #endif
> < one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
> < ln2 = 6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */
> < huge= 1.00000000000000000000e+300;
> <
> < #ifdef __STDC__
> < double asinh(double x)
> < #else
> < double asinh(x)
> < double x;
> < #endif
> < {
> ---
>> static double compute(double x) {
> 39c29
> < w = __ieee754_log(fabs(x))+ln2;
> ---
>> w = log(Math.abs(x))+ln2;
> 41,42c31,32
> < t = fabs(x);
> < w = __ieee754_log(2.0*t+one/(sqrt(x*x+one)+t));
> ---
>> t = Math.abs(x);
>> w = log(2.0*t+one/(sqrt(x*x+one)+t));
> 45c35
> < w =log1p(fabs(x)+t/(one+sqrt(one+t)));
> ---
>> w =log1p(Math.abs(x)+t/(one+sqrt(one+t)));
> 47a38
>> }
>
> Transliteration port vs more idiomatic port:
>
>
> $ diff -w Asinh.translit.java Asinh.fdlibm.java
> 6,9c6,12
> < * Based on
> < * asinh(x) = sign(x) * log [ |x| + sqrt(x*x+1) ]
> < * we have
> < * asinh(x) := x if 1+x*x=1,
> ---
>> *
>> * asinh(x) is defined so that asinh(sinh(alpha)) = alpha -INF < alpha < < INF
>> * and sinh(asinh(x)) = x, -INF < x < INF.
>> * It can be written as asinh(x) = ln(x + sqrt(x^2 + 1)), -INF < x < INF.
>> * 1. Replace x by |x| as the function is odd.
>> * 2.
>> * asinh(x) := x, if 1+x^2 = 1,
> 12a16,22
>> *
>> *
>> *
>> * Special cases:
>> * only asinh(0)=0 is exact for finite x.
>> * asinh(NaN) is NaN
>> * asinh(INF) is INF
> 14,15c24
> < private static final class Asinh {
> < private static final double one = 1.0;
> ---
>> static final class Asinh {
> 24c33,35
> < if(ix>=0x7ff00000) return x+x; /* x is inf or NaN */
> ---
>> if(ix >= 0x7ff00000) {
>> return x + x; /* x is inf or NaN */
>> }
> 26c37,39
> < if(huge+x>one) return x; /* return x inexact except 0...
Anton Artemov has updated the pull request incrementally with one additional commit since the last revision:
8375285: Addressed the reviewer's comments, fixed year in the copyright notice.
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/29273/files
- new: https://git.openjdk.org/jdk/pull/29273/files/24a7b7ca..d6ed1b89
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=29273&range=01
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=29273&range=00-01
Stats: 14 lines in 6 files changed: 0 ins; 0 del; 14 mod
Patch: https://git.openjdk.org/jdk/pull/29273.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/29273/head:pull/29273
PR: https://git.openjdk.org/jdk/pull/29273
More information about the core-libs-dev
mailing list