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/ › log1p.zig › log1p_64
log1p_64
log1p.log1p_64
fn log1p_64 (x : f64 ) f64
File
Code
fn log1p_64 (x : f64 ) f64 {
const ln2_hi : f64 = 6.93147180369123816490e-01 ;
const ln2_lo : f64 = 1.90821492927058770002e-10 ;
const Lg1 : f64 = 6.666666666666735130e-01 ;
const Lg2 : f64 = 3.999999999940941908e-01 ;
const Lg3 : f64 = 2.857142874366239149e-01 ;
const Lg4 : f64 = 2.222219843214978396e-01 ;
const Lg5 : f64 = 1.818357216161805012e-01 ;
const Lg6 : f64 = 1.531383769920937332e-01 ;
const Lg7 : f64 = 1.479819860511658591e-01 ;
const ix : u64 = @bitCast (x );
const hx : u32 = @intCast (ix >> 32 );
var k : i32 = 1 ;
var c : f64 = undefined ;
var f : f64 = undefined ;
if (hx < 0x3FDA827A or hx >> 31 != 0 ) {
if (ix == 0xBFF0000000000000 )
return x / 0.0 ;
if (hx >= 0xBFF00000 )
return (x - x ) / 0.0 ;
if ((hx << 1 ) < (0x3CA00000 << 1 )) {
if ((hx & 0x7FF00000 ) == 0 ) {
mem .doNotOptimizeAway (@as (f32 , @floatCast (x )));
}
return x ;
}
if (hx <= 0xBFD2BEC4 ) {
k = 0 ;
c = 0 ;
f = x ;
}
} else if (hx >= 0x7FF00000 ) {
return x ;
}
if (k != 0 ) {
const uf = 1 + x ;
const hu = @as (u64 , @bitCast (uf ));
var iu = @as (u32 , @intCast (hu >> 32 ));
iu += 0x3FF00000 - 0x3FE6A09E ;
k = @as (i32 , @intCast (iu >> 20 )) - 0x3FF ;
if (k < 54 ) {
c = if (k >= 2 ) 1 - (uf - x ) else x - (uf - 1 );
c /= uf ;
} else {
c = 0 ;
}
iu = (iu & 0x000FFFFF ) + 0x3FE6A09E ;
const iq = (@as (u64 , iu ) << 32 ) | (hu & 0xFFFFFFFF );
f = @as (f64 , @bitCast (iq )) - 1 ;
}
const hfsq = 0.5 * f * f ;
const s = f / (2.0 + f );
const z = s * s ;
const w = z * z ;
const t1 = w * (Lg2 + w * (Lg4 + w * Lg6 ));
const t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7 )));
const R = t2 + t1 ;
const dk = @as (f64 , @floatFromInt (k ));
return s * (hfsq + R ) + (dk * ln2_lo + c ) - hfsq + f + dk * ln2_hi ;
}