Zig 0.17.0-dev (Split by item)
This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig library itself.
Zig › std/ › math/ › expm1.zig › expm1_64
expm1_64
expm1.expm1_64
fn expm1_64 (x_ : f64 ) f64
File
Code
fn expm1_64 (x_ : f64 ) f64 {
if (math .isNan (x_ ))
return math .nan (f64 );
const o_threshold : f64 = 7.09782712893383973096e+02 ;
const ln2_hi : f64 = 6.93147180369123816490e-01 ;
const ln2_lo : f64 = 1.90821492927058770002e-10 ;
const invln2 : f64 = 1.44269504088896338700e+00 ;
const Q1 : f64 = -3.33333333333331316428e-02 ;
const Q2 : f64 = 1.58730158725481460165e-03 ;
const Q3 : f64 = -7.93650757867487942473e-05 ;
const Q4 : f64 = 4.00821782732936239552e-06 ;
const Q5 : f64 = -2.01099218183624371326e-07 ;
var x = x_ ;
const ux = @as (u64 , @bitCast (x ));
const hx = @as (u32 , @intCast (ux >> 32 )) & 0x7FFFFFFF ;
const sign = ux >> 63 ;
if (math .isNegativeInf (x )) {
return -1.0 ;
}
if (hx >= 0x4043687A ) {
if (hx > 0x7FF00000 ) {
return x ;
}
if (sign != 0 ) {
return -1 ;
}
if (x > o_threshold ) {
math .raiseOverflow ();
return math .inf (f64 );
}
}
var hi : f64 = undefined ;
var lo : f64 = undefined ;
var c : f64 = undefined ;
var k : i32 = undefined ;
if (hx > 0x3FD62E42 ) {
if (hx < 0x3FF0A2B2 ) {
if (sign == 0 ) {
hi = x - ln2_hi ;
lo = ln2_lo ;
k = 1 ;
} else {
hi = x + ln2_hi ;
lo = -ln2_lo ;
k = -1 ;
}
} else {
var kf = invln2 * x ;
if (sign != 0 ) {
kf -= 0.5 ;
} else {
kf += 0.5 ;
}
k = @as (i32 , @intFromFloat (kf ));
const t = @as (f64 , @floatFromInt (k ));
hi = x - t * ln2_hi ;
lo = t * ln2_lo ;
}
x = hi - lo ;
c = (hi - x ) - lo ;
}
else if (hx < 0x3C900000 ) {
if (hx < 0x00100000 ) {
mem .doNotOptimizeAway (@as (f32 , @floatCast (x )));
}
return x ;
} else {
k = 0 ;
}
const hfx = 0.5 * x ;
const hxs = x * hfx ;
const r1 = 1.0 + hxs * (Q1 + hxs * (Q2 + hxs * (Q3 + hxs * (Q4 + hxs * Q5 ))));
const t = 3.0 - r1 * hfx ;
var e = hxs * ((r1 - t ) / (6.0 - x * t ));
if (k == 0 ) {
return x - (x * e - hxs );
}
e = x * (e - c ) - c ;
e -= hxs ;
if (k == -1 ) {
return 0.5 * (x - e ) - 0.5 ;
}
if (k == 1 ) {
if (x < -0.25 ) {
return -2.0 * (e - (x + 0.5 ));
} else {
return 1.0 + 2.0 * (x - e );
}
}
const twopk = @as (f64 , @bitCast (@as (u64 , @intCast (0x3FF +% k )) << 52 ));
if (k < 0 or k > 56 ) {
var y = x - e + 1.0 ;
if (k == 1024 ) {
y = y * 2.0 * 0x1.0p1023 ;
} else {
y = y * twopk ;
}
return y - 1.0 ;
}
const uf = @as (f64 , @bitCast (@as (u64 , @intCast (0x3FF -% k )) << 52 ));
if (k < 20 ) {
return (x - e + (1 - uf )) * twopk ;
} else {
return (x - (e + uf ) + 1 ) * twopk ;
}
}