fn atanh_64(x: f64) f64 x: f6458
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85fn atanh_64(x: f64) f64 {
const u: u64 = @bitCast(x);
const e = (u >> 52) & 0x7FF;
const s = u >> 63;
var y: f64 = @bitCast(u & (maxInt(u64) >> 1)); // |x|
if (y == 1.0) {
return math.copysign(math.inf(f64), x);
}
if (e < 0x3FF - 1) {
if (e < 0x3FF - 32) {
// underflow
if (e == 0) {
mem.doNotOptimizeAway(@as(f32, @floatCast(y)));
}
}
// |x| < 0.5
else {
y = 0.5 * math.log1p(2 * y + 2 * y * y / (1 - y));
}
} else {
y = 0.5 * math.log1p(2 * (y / (1 - y)));
}
return if (s != 0) -y else y;
}